1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-14 18:50:39 +01:00

migrating to string ids

This commit is contained in:
Mariotaku Lee 2016-03-10 12:23:04 +08:00
parent 444a8df11d
commit 2456f710e5
87 changed files with 467 additions and 409 deletions

View File

@ -18,5 +18,5 @@ public interface StatusNetResources {
StatusNetConfig getStatusNetConfig() throws TwitterException; StatusNetConfig getStatusNetConfig() throws TwitterException;
@GET("/statusnet/conversation/{id}.json") @GET("/statusnet/conversation/{id}.json")
ResponseList<Status> getStatusNetConversation(@Path("id") long statusId, @Query Paging paging) throws TwitterException; ResponseList<Status> getStatusNetConversation(@Path("id") String statusId, @Query Paging paging) throws TwitterException;
} }

View File

@ -12,7 +12,7 @@ public class Attention {
@JsonField(name = "fullname") @JsonField(name = "fullname")
String fullName; String fullName;
@JsonField(name = "id") @JsonField(name = "id")
long id; String id;
@JsonField(name = "ostatus_uri") @JsonField(name = "ostatus_uri")
String ostatusUri; String ostatusUri;
@JsonField(name = "profileurl") @JsonField(name = "profileurl")
@ -24,7 +24,7 @@ public class Attention {
return fullName; return fullName;
} }
public long getId() { public String getId() {
return id; return id;
} }

View File

@ -40,7 +40,7 @@ public interface DirectMessagesResources {
@POST("/direct_messages/destroy.json") @POST("/direct_messages/destroy.json")
@BodyType(BodyType.FORM) @BodyType(BodyType.FORM)
DirectMessage destroyDirectMessage(@Param("id") long id) throws TwitterException; DirectMessage destroyDirectMessage(@Param("id") String id) throws TwitterException;
@GET("/direct_messages.json") @GET("/direct_messages.json")
ResponseList<DirectMessage> getDirectMessages(@Query Paging paging) throws TwitterException; ResponseList<DirectMessage> getDirectMessages(@Query Paging paging) throws TwitterException;
@ -50,24 +50,24 @@ public interface DirectMessagesResources {
@POST("/direct_messages/new.json") @POST("/direct_messages/new.json")
@BodyType(BodyType.FORM) @BodyType(BodyType.FORM)
DirectMessage sendDirectMessage(@Param("user_id") long userId, @Param("text") String text) DirectMessage sendDirectMessage(@Param("user_id") String userId, @Param("text") String text)
throws TwitterException; throws TwitterException;
@POST("/direct_messages/new.json") @POST("/direct_messages/new.json")
@BodyType(BodyType.FORM) @BodyType(BodyType.FORM)
DirectMessage sendDirectMessage(@Param("user_id") long userId, @Param("text") String text, DirectMessage sendDirectMessage(@Param("user_id") String userId, @Param("text") String text,
@Param("media_id") long mediaId) throws TwitterException; @Param("media_id") long mediaId) throws TwitterException;
@POST("/direct_messages/new.json") @POST("/direct_messages/new.json")
@BodyType(BodyType.FORM) @BodyType(BodyType.FORM)
DirectMessage sendDirectMessage(@Param("screen_name") String screenName, @Param("text") String text) DirectMessage sendDirectMessageForScreenName(@Param("screen_name") String screenName, @Param("text") String text)
throws TwitterException; throws TwitterException;
@POST("/direct_messages/new.json") @POST("/direct_messages/new.json")
@BodyType(BodyType.FORM) @BodyType(BodyType.FORM)
DirectMessage sendDirectMessage(@Param("screen_name") String screenName, @Param("text") String text, DirectMessage sendDirectMessageForScreenName(@Param("screen_name") String screenName, @Param("text") String text,
@Param("media_id") long mediaId) throws TwitterException; @Param("media_id") long mediaId) throws TwitterException;
@GET("/direct_messages/show.json") @GET("/direct_messages/show.json")
DirectMessage showDirectMessage(@Query("id") long id) throws TwitterException; DirectMessage showDirectMessage(@Query("id") String id) throws TwitterException;
} }

View File

@ -21,9 +21,11 @@ package org.mariotaku.twidere.api.twitter.model;
import com.bluelinelabs.logansquare.annotation.JsonField; import com.bluelinelabs.logansquare.annotation.JsonField;
import com.bluelinelabs.logansquare.annotation.JsonObject; import com.bluelinelabs.logansquare.annotation.JsonObject;
import com.bluelinelabs.logansquare.annotation.OnJsonParseComplete;
import org.mariotaku.twidere.api.twitter.util.TwitterDateConverter; import org.mariotaku.twidere.api.twitter.util.TwitterDateConverter;
import java.io.IOException;
import java.util.Date; import java.util.Date;
/** /**
@ -48,9 +50,9 @@ public class DirectMessage extends TwitterResponseObject implements TwitterRespo
String text; String text;
@JsonField(name = "id") @JsonField(name = "id")
long id; String id;
public long getId() { public String getId() {
return id; return id;
} }
@ -109,4 +111,9 @@ public class DirectMessage extends TwitterResponseObject implements TwitterRespo
public String getRecipientScreenName() { public String getRecipientScreenName() {
return recipient.screenName; return recipient.screenName;
} }
@OnJsonParseComplete
void onJsonParseComplete() throws IOException {
if (id == null || recipient == null || sender == null) throw new IOException("Malformed DirectMessage object");
}
} }

View File

@ -72,13 +72,13 @@ public class IDs$$JsonObjectMapper extends JsonMapper<IDs> {
} }
private void parseIDsArray(IDs instance, JsonParser jsonParser) throws IOException { private void parseIDsArray(IDs instance, JsonParser jsonParser) throws IOException {
List<Long> collection1 = new ArrayList<>(); List<String> collection1 = new ArrayList<>();
while (jsonParser.nextToken() != JsonToken.END_ARRAY) { while (jsonParser.nextToken() != JsonToken.END_ARRAY) {
collection1.add(jsonParser.getValueAsLong()); collection1.add(jsonParser.getValueAsString());
} }
long[] array = new long[collection1.size()]; String[] array = new String[collection1.size()];
int i = 0; int i = 0;
for (long value : collection1) { for (String value : collection1) {
array[i++] = value; array[i++] = value;
} }
instance.ids = array; instance.ids = array;

View File

@ -34,7 +34,7 @@ public class IDs extends TwitterResponseObject implements TwitterResponse, Curso
long previousCursor; long previousCursor;
long nextCursor; long nextCursor;
long[] ids; String[] ids;
@Override @Override
public long getNextCursor() { public long getNextCursor() {
@ -56,7 +56,7 @@ public class IDs extends TwitterResponseObject implements TwitterResponse, Curso
return previousCursor != 0; return previousCursor != 0;
} }
public long[] getIDs() { public String[] getIDs() {
return ids; return ids;
} }

View File

@ -231,8 +231,8 @@ public class Status extends TwitterResponseObject implements Comparable<Status>,
* <i>Perspectival</i>. Only surfaces on methods supporting the <code>include_my_retweet</code> parameter, * <i>Perspectival</i>. Only surfaces on methods supporting the <code>include_my_retweet</code> parameter,
* when set to true. Details the Tweet ID of the users own retweet (if existent) of this Tweet. * when set to true. Details the Tweet ID of the users own retweet (if existent) of this Tweet.
*/ */
public long getCurrentUserRetweet() { public String getCurrentUserRetweet() {
if (currentUserRetweet == null) return -1; if (currentUserRetweet == null) return null;
return currentUserRetweet.id; return currentUserRetweet.id;
} }
@ -400,7 +400,7 @@ public class Status extends TwitterResponseObject implements Comparable<Status>,
@JsonObject @JsonObject
public static class CurrentUserRetweet { public static class CurrentUserRetweet {
@JsonField(name = "id") @JsonField(name = "id")
long id; String id;
} }
} }

View File

@ -33,7 +33,7 @@ public class StatusUpdate extends SimpleValueMap {
return this; return this;
} }
public void setInReplyToStatusId(final long inReplyToStatusId) { public void setInReplyToStatusId(final String inReplyToStatusId) {
put("in_reply_to_status_id", inReplyToStatusId); put("in_reply_to_status_id", inReplyToStatusId);
} }
@ -55,7 +55,7 @@ public class StatusUpdate extends SimpleValueMap {
put("place_id", placeId); put("place_id", placeId);
} }
public StatusUpdate inReplyToStatusId(final long inReplyToStatusId) { public StatusUpdate inReplyToStatusId(final String inReplyToStatusId) {
setInReplyToStatusId(inReplyToStatusId); setInReplyToStatusId(inReplyToStatusId);
return this; return this;
} }

View File

@ -29,7 +29,7 @@ import com.bluelinelabs.logansquare.annotation.JsonObject;
public class TranslationResult extends TwitterResponseObject implements TwitterResponse { public class TranslationResult extends TwitterResponseObject implements TwitterResponse {
@JsonField(name = "id") @JsonField(name = "id")
long id; String id;
@JsonField(name = "lang") @JsonField(name = "lang")
String lang; String lang;
@JsonField(name = "translated_lang") @JsonField(name = "translated_lang")
@ -39,7 +39,7 @@ public class TranslationResult extends TwitterResponseObject implements TwitterR
@JsonField(name = "text") @JsonField(name = "text")
String text; String text;
public long getId() { public String getId() {
return id; return id;
} }
@ -58,4 +58,15 @@ public class TranslationResult extends TwitterResponseObject implements TwitterR
public String getTranslationType() { public String getTranslationType() {
return translationType; return translationType;
} }
@Override
public String toString() {
return "TranslationResult{" +
"id='" + id + '\'' +
", lang='" + lang + '\'' +
", translatedLang='" + translatedLang + '\'' +
", translationType='" + translationType + '\'' +
", text='" + text + '\'' +
"} " + super.toString();
}
} }

View File

@ -30,7 +30,7 @@ public class UserMentionEntity {
@JsonField(name = "indices", typeConverter = IndicesConverter.class) @JsonField(name = "indices", typeConverter = IndicesConverter.class)
Indices indices; Indices indices;
@JsonField(name = "id") @JsonField(name = "id")
long id; String id;
@JsonField(name = "name") @JsonField(name = "name")
String name; String name;
@JsonField(name = "screen_name") @JsonField(name = "screen_name")
@ -50,7 +50,7 @@ public class UserMentionEntity {
return indices.getEnd(); return indices.getEnd();
} }
public long getId() { public String getId() {
return id; return id;
} }

View File

@ -42,18 +42,6 @@ import java.util.Arrays;
@CursorObject(valuesCreator = true) @CursorObject(valuesCreator = true)
public class ParcelableDirectMessage implements Parcelable, Comparable<ParcelableDirectMessage> { public class ParcelableDirectMessage implements Parcelable, Comparable<ParcelableDirectMessage> {
public static final Creator<ParcelableDirectMessage> CREATOR = new Creator<ParcelableDirectMessage>() {
public ParcelableDirectMessage createFromParcel(Parcel source) {
ParcelableDirectMessage target = new ParcelableDirectMessage();
ParcelableDirectMessageParcelablePlease.readFromParcel(target, source);
return target;
}
public ParcelableDirectMessage[] newArray(int size) {
return new ParcelableDirectMessage[size];
}
};
@ParcelableThisPlease @ParcelableThisPlease
@JsonField(name = "account_id", typeConverter = UserKeyConverter.class) @JsonField(name = "account_id", typeConverter = UserKeyConverter.class)
@CursorField(value = DirectMessages.ACCOUNT_KEY, converter = UserKeyCursorFieldConverter.class) @CursorField(value = DirectMessages.ACCOUNT_KEY, converter = UserKeyCursorFieldConverter.class)
@ -61,7 +49,7 @@ public class ParcelableDirectMessage implements Parcelable, Comparable<Parcelabl
@ParcelableThisPlease @ParcelableThisPlease
@JsonField(name = "id") @JsonField(name = "id")
@CursorField(DirectMessages.MESSAGE_ID) @CursorField(DirectMessages.MESSAGE_ID)
public long id; public String id;
@ParcelableThisPlease @ParcelableThisPlease
@JsonField(name = "timestamp") @JsonField(name = "timestamp")
@CursorField(DirectMessages.MESSAGE_TIMESTAMP) @CursorField(DirectMessages.MESSAGE_TIMESTAMP)
@ -70,11 +58,11 @@ public class ParcelableDirectMessage implements Parcelable, Comparable<Parcelabl
@ParcelableThisPlease @ParcelableThisPlease
@JsonField(name = "sender_id") @JsonField(name = "sender_id")
@CursorField(DirectMessages.SENDER_ID) @CursorField(DirectMessages.SENDER_ID)
public long sender_id; public String sender_id;
@ParcelableThisPlease @ParcelableThisPlease
@JsonField(name = "recipient_id") @JsonField(name = "recipient_id")
@CursorField(DirectMessages.RECIPIENT_ID) @CursorField(DirectMessages.RECIPIENT_ID)
public long recipient_id; public String recipient_id;
@ParcelableThisPlease @ParcelableThisPlease
@JsonField(name = "is_outgoing") @JsonField(name = "is_outgoing")
@ -130,9 +118,7 @@ public class ParcelableDirectMessage implements Parcelable, Comparable<Parcelabl
@Override @Override
public int compareTo(@NonNull final ParcelableDirectMessage another) { public int compareTo(@NonNull final ParcelableDirectMessage another) {
final long diff = another.id - id; final long diff = another.timestamp - timestamp;
if (diff > Integer.MAX_VALUE) return Integer.MAX_VALUE;
if (diff < Integer.MIN_VALUE) return Integer.MIN_VALUE;
return (int) diff; return (int) diff;
} }
@ -143,15 +129,15 @@ public class ParcelableDirectMessage implements Parcelable, Comparable<Parcelabl
ParcelableDirectMessage that = (ParcelableDirectMessage) o; ParcelableDirectMessage that = (ParcelableDirectMessage) o;
if (id != that.id) return false; if (!account_key.equals(that.account_key)) return false;
return account_key.equals(that.account_key); return id.equals(that.id);
} }
@Override @Override
public int hashCode() { public int hashCode() {
int result = account_key.hashCode(); int result = account_key.hashCode();
result = 31 * result + (int) (id ^ (id >>> 32)); result = 31 * result + id.hashCode();
return result; return result;
} }
@ -186,4 +172,16 @@ public class ParcelableDirectMessage implements Parcelable, Comparable<Parcelabl
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
ParcelableDirectMessageParcelablePlease.writeToParcel(this, dest, flags); ParcelableDirectMessageParcelablePlease.writeToParcel(this, dest, flags);
} }
public static final Creator<ParcelableDirectMessage> CREATOR = new Creator<ParcelableDirectMessage>() {
public ParcelableDirectMessage createFromParcel(Parcel source) {
ParcelableDirectMessage target = new ParcelableDirectMessage();
ParcelableDirectMessageParcelablePlease.readFromParcel(target, source);
return target;
}
public ParcelableDirectMessage[] newArray(int size) {
return new ParcelableDirectMessage[size];
}
};
} }

View File

@ -128,6 +128,9 @@ public class UserKey implements Comparable<UserKey>, Parcelable {
escaping = true; escaping = true;
} else if (ch == '@') { } else if (ch == '@') {
idFinished = true; idFinished = true;
} else if (ch == ',') {
// end of item
break;
} }
} }
if (!isSpecialChar(ch) || !escaping) { if (!isSpecialChar(ch) || !escaping) {
@ -180,7 +183,7 @@ public class UserKey implements Comparable<UserKey>, Parcelable {
} }
private static boolean isSpecialChar(char ch) { private static boolean isSpecialChar(char ch) {
return ch == '\\' || ch == '@'; return ch == '\\' || ch == '@' || ch == ',';
} }
public boolean maybeEquals(@Nullable UserKey another) { public boolean maybeEquals(@Nullable UserKey another) {

View File

@ -15,13 +15,13 @@ import com.hannesdorfmann.parcelableplease.annotation.ParcelableThisPlease;
public class SendDirectMessageActionExtra implements ActionExtra { public class SendDirectMessageActionExtra implements ActionExtra {
@ParcelableThisPlease @ParcelableThisPlease
@JsonField(name = "recipient_id") @JsonField(name = "recipient_id")
long recipientId; String recipientId;
public long getRecipientId() { public String getRecipientId() {
return recipientId; return recipientId;
} }
public void setRecipientId(long recipientId) { public void setRecipientId(String recipientId) {
this.recipientId = recipientId; this.recipientId = recipientId;
} }

View File

@ -407,8 +407,8 @@ public interface TwidereDataStore {
SENDER_ID, RECIPIENT_ID, CONVERSATION_ID, IS_OUTGOING, TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, SENDER_ID, RECIPIENT_ID, CONVERSATION_ID, IS_OUTGOING, TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED,
SENDER_NAME, RECIPIENT_NAME, SENDER_SCREEN_NAME, RECIPIENT_SCREEN_NAME, SENDER_PROFILE_IMAGE_URL, SENDER_NAME, RECIPIENT_NAME, SENDER_SCREEN_NAME, RECIPIENT_SCREEN_NAME, SENDER_PROFILE_IMAGE_URL,
RECIPIENT_PROFILE_IMAGE_URL, MEDIA_JSON, INSERTED_DATE}; RECIPIENT_PROFILE_IMAGE_URL, MEDIA_JSON, INSERTED_DATE};
String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL, TYPE_INT,
TYPE_INT, TYPE_INT, TYPE_INT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL, TYPE_INT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, INSERTED_DATE_TYPE}; TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, INSERTED_DATE_TYPE};
String DEFAULT_SORT_ORDER = MESSAGE_ID + " DESC"; String DEFAULT_SORT_ORDER = MESSAGE_ID + " DESC";
@ -890,10 +890,10 @@ public interface TwidereDataStore {
String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL, TYPE_INT, String[] TYPES = {TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL, TYPE_INT,
TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT,
TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_INT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_BOOLEAN,
TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN,
TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, INSERTED_DATE_TYPE, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, INSERTED_DATE_TYPE,

View File

@ -39,14 +39,14 @@ import java.util.Arrays;
public class RefreshEvent extends BaseEvent implements Parcelable { public class RefreshEvent extends BaseEvent implements Parcelable {
@JsonField(name = "ids") @JsonField(name = "ids")
@ParcelableThisPlease @ParcelableThisPlease
long[] ids; String[] ids;
@JsonField(name = "timeline_type") @JsonField(name = "timeline_type")
@ParcelableThisPlease @ParcelableThisPlease
@TimelineType @TimelineType
String timelineType; String timelineType;
public static RefreshEvent create(final Context context, long[] ids, @TimelineType String timelineType) { public static RefreshEvent create(final Context context, String[] ids, @TimelineType String timelineType) {
final RefreshEvent event = new RefreshEvent(); final RefreshEvent event = new RefreshEvent();
event.markStart(context); event.markStart(context);
event.setIds(ids); event.setIds(ids);
@ -54,7 +54,7 @@ public class RefreshEvent extends BaseEvent implements Parcelable {
return event; return event;
} }
public void setIds(long[] ids) { public void setIds(String[] ids) {
this.ids = ids; this.ids = ids;
} }

View File

@ -32,7 +32,7 @@ import org.mariotaku.twidere.model.UserKey;
@JsonObject @JsonObject
public class ScrollRecord implements LogModel { public class ScrollRecord implements LogModel {
@JsonField(name = "id") @JsonField(name = "id")
long id; String id;
@JsonField(name = "account_id") @JsonField(name = "account_id")
String accountId; String accountId;
@JsonField(name = "account_host") @JsonField(name = "account_host")
@ -44,7 +44,7 @@ public class ScrollRecord implements LogModel {
@JsonField(name = "scroll_state") @JsonField(name = "scroll_state")
int scrollState; int scrollState;
public static ScrollRecord create(long id, UserKey accountKey, long timestamp, long timeOffset, int scrollState) { public static ScrollRecord create(String id, UserKey accountKey, long timestamp, long timeOffset, int scrollState) {
final ScrollRecord record = new ScrollRecord(); final ScrollRecord record = new ScrollRecord();
record.setId(id); record.setId(id);
record.setAccountId(accountKey.getId()); record.setAccountId(accountKey.getId());
@ -67,7 +67,7 @@ public class ScrollRecord implements LogModel {
this.timeOffset = timeOffset; this.timeOffset = timeOffset;
} }
public void setId(long id) { public void setId(String id) {
this.id = id; this.id = id;
} }

View File

@ -20,6 +20,7 @@
package org.mariotaku.twidere; package org.mariotaku.twidere;
import org.mariotaku.twidere.annotation.Preference; import org.mariotaku.twidere.annotation.Preference;
import org.mariotaku.twidere.model.UserKey;
import static org.mariotaku.twidere.annotation.PreferenceType.BOOLEAN; import static org.mariotaku.twidere.annotation.PreferenceType.BOOLEAN;
import static org.mariotaku.twidere.annotation.PreferenceType.STRING; import static org.mariotaku.twidere.annotation.PreferenceType.STRING;
@ -83,7 +84,7 @@ public interface Constants extends TwidereConstants {
String TWIDERE_PREVIEW_TEXT_UNESCAPED = "Twidere is an open source twitter client for Android, see github.com/mariotak&#8230;"; String TWIDERE_PREVIEW_TEXT_UNESCAPED = "Twidere is an open source twitter client for Android, see github.com/mariotak&#8230;";
String TWIDERE_PREVIEW_SOURCE = "Twidere for Android"; String TWIDERE_PREVIEW_SOURCE = "Twidere for Android";
long HONDAJOJO_ID = 514378421; UserKey HONDAJOJO_ID = new UserKey("514378421", USER_TYPE_TWITTER_COM);
String HONDAJOJO_SCREEN_NAME = "HondaJOJO"; String HONDAJOJO_SCREEN_NAME = "HondaJOJO";
String EASTER_EGG_TRIGGER_TEXT = "\u718A\u5B69\u5B50"; String EASTER_EGG_TRIGGER_TEXT = "\u718A\u5B69\u5B50";
String EASTER_EGG_RESTORE_TEXT_PART1 = "\u5927\u738B"; String EASTER_EGG_RESTORE_TEXT_PART1 = "\u5927\u738B";

View File

@ -1034,7 +1034,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements OnMenuIte
} }
private boolean handleQuoteIntent(final ParcelableStatus status) { private boolean handleQuoteIntent(final ParcelableStatus status) {
if (status == null || status.id <= 0) return false; if (status == null) return false;
mEditText.setText(Utils.getQuoteStatus(this, status.id, status.user_screen_name, status.text_plain)); mEditText.setText(Utils.getQuoteStatus(this, status.id, status.user_screen_name, status.text_plain));
mEditText.setSelection(0); mEditText.setSelection(0);
mAccountsAdapter.setSelectedAccountIds(status.account_key); mAccountsAdapter.setSelectedAccountIds(status.account_key);
@ -1070,7 +1070,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements OnMenuIte
} }
private boolean handleReplyIntent(final ParcelableStatus status) { private boolean handleReplyIntent(final ParcelableStatus status) {
if (status == null || status.id <= 0) return false; if (status == null || status.id == null) return false;
final String myScreenName = DataStoreUtils.getAccountScreenName(this, status.account_key); final String myScreenName = DataStoreUtils.getAccountScreenName(this, status.account_key);
if (TextUtils.isEmpty(myScreenName)) return false; if (TextUtils.isEmpty(myScreenName)) return false;
int selectionStart = 0; int selectionStart = 0;

View File

@ -817,7 +817,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
if (mPagerAdapter.getCount() == 0) return; if (mPagerAdapter.getCount() == 0) return;
final SupportTabSpec tab = mPagerAdapter.getTab(position); final SupportTabSpec tab = mPagerAdapter.getTab(position);
if (DirectMessagesFragment.class == tab.cls) { if (DirectMessagesFragment.class == tab.cls) {
IntentUtils.openMessageConversation(this, null, -1); IntentUtils.openMessageConversation(this, null, null);
} else if (TrendsSuggestionsFragment.class == tab.cls) { } else if (TrendsSuggestionsFragment.class == tab.cls) {
openSearchView(null); openSearchView(null);
} else { } else {

View File

@ -179,7 +179,7 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On
break; break;
} }
case SuggestionsAdapter.VIEW_TYPE_USER_SCREEN_NAME: { case SuggestionsAdapter.VIEW_TYPE_USER_SCREEN_NAME: {
IntentUtils.openUserProfile(this, getSelectedAccountKey(), -1, item.title, null, true, IntentUtils.openUserProfile(this, getSelectedAccountKey(), null, item.title, null, true,
UserFragment.Referral.DIRECT); UserFragment.Referral.DIRECT);
finish(); finish();
break; break;
@ -316,13 +316,14 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On
public final String title, summary; public final String title, summary;
public final long _id, extra_id; public final long _id;
public final String extra_id;
public SuggestionItem(Cursor cursor, SuggestionsAdapter.Indices indices) { public SuggestionItem(Cursor cursor, SuggestionsAdapter.Indices indices) {
_id = cursor.getLong(indices._id); _id = cursor.getLong(indices._id);
title = cursor.getString(indices.title); title = cursor.getString(indices.title);
summary = cursor.getString(indices.summary); summary = cursor.getString(indices.summary);
extra_id = cursor.getLong(indices.extra_id); extra_id = cursor.getString(indices.extra_id);
} }
} }

View File

@ -1095,8 +1095,7 @@ public class SignInActivity extends BaseAppCompatActivity implements OnClickList
if (accountType != null) { if (accountType != null) {
values.put(Accounts.ACCOUNT_TYPE, accountType.first); values.put(Accounts.ACCOUNT_TYPE, accountType.first);
values.put(Accounts.ACCOUNT_EXTRAS, accountType.second); values.put(Accounts.ACCOUNT_EXTRAS, accountType.second);
final UserKey accountKey = new UserKey(user.getId(), final UserKey accountKey = UserKeyUtils.fromUser(user);
UserKeyUtils.getUserHost(user.getOstatusUri()));
final ParcelableUser parcelableUser = ParcelableUserUtils.fromUser(user, accountKey); final ParcelableUser parcelableUser = ParcelableUserUtils.fromUser(user, accountKey);
values.put(Accounts.ACCOUNT_USER, JsonSerializer.serialize(parcelableUser, ParcelableUser.class)); values.put(Accounts.ACCOUNT_USER, JsonSerializer.serialize(parcelableUser, ParcelableUser.class));
} }

View File

@ -20,6 +20,7 @@
package org.mariotaku.twidere.adapter; package org.mariotaku.twidere.adapter;
import android.content.Context; import android.content.Context;
import android.support.annotation.NonNull;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
@ -126,9 +127,9 @@ public class AccountsSpinnerAdapter extends ArrayAdapter<ParcelableCredentials>
notifyDataSetChanged(); notifyDataSetChanged();
} }
public int findPositionByKey(UserKey key) { public int findPositionByKey(@NonNull UserKey key) {
for (int i = 0, j = getCount(); i < j; i++) { for (int i = 0, j = getCount(); i < j; i++) {
if (getItem(i).account_key.equals(key)) { if (key.equals(getItem(i).account_key)) {
return i; return i;
} }
} }

View File

@ -182,6 +182,11 @@ public final class DummyStatusHolderAdapter implements IStatusesAdapter<Object>,
return null; return null;
} }
@Override
public long getStatusTimestamp(int adapterPosition) {
return -1;
}
@Override @Override
@Nullable @Nullable
public UserKey getAccountKey(int position) { public UserKey getAccountKey(int position) {

View File

@ -243,12 +243,12 @@ public class MessageEntriesAdapter extends LoadMoreSupportAdapter<ViewHolder> im
public static class DirectMessageEntry { public static class DirectMessageEntry {
public final UserKey account_key; public final UserKey account_key;
public final long conversation_id; public final String conversation_id;
public final String screen_name, name; public final String screen_name, name;
DirectMessageEntry(Cursor cursor) { DirectMessageEntry(Cursor cursor) {
account_key = UserKey.valueOf(cursor.getString(ConversationEntries.IDX_ACCOUNT_KEY)); account_key = UserKey.valueOf(cursor.getString(ConversationEntries.IDX_ACCOUNT_KEY));
conversation_id = cursor.getLong(ConversationEntries.IDX_CONVERSATION_ID); conversation_id = cursor.getString(ConversationEntries.IDX_CONVERSATION_ID);
screen_name = cursor.getString(ConversationEntries.IDX_SCREEN_NAME); screen_name = cursor.getString(ConversationEntries.IDX_SCREEN_NAME);
name = cursor.getString(ConversationEntries.IDX_NAME); name = cursor.getString(ConversationEntries.IDX_NAME);
} }

View File

@ -79,7 +79,7 @@ public class ParcelableActivitiesAdapter extends LoadMoreSupportAdapter<Recycler
private List<ParcelableActivity> mData; private List<ParcelableActivity> mData;
private final boolean mIsByFriends; private final boolean mIsByFriends;
private ActivityAdapterListener mActivityAdapterListener; private ActivityAdapterListener mActivityAdapterListener;
private long[] mFilteredUserIds; private String[] mFilteredUserIds;
private boolean mFollowingOnly; private boolean mFollowingOnly;
private boolean mMentionsOnly; private boolean mMentionsOnly;

View File

@ -152,6 +152,19 @@ public abstract class ParcelableStatusesAdapter extends LoadMoreSupportAdapter<R
return mData.get(dataPosition).id; return mData.get(dataPosition).id;
} }
@Override
public long getStatusTimestamp(int adapterPosition) {
int dataPosition = adapterPosition - getStatusStartIndex();
if (dataPosition < 0 || dataPosition >= getStatusCount()) return -1;
if (mData instanceof ObjectCursor) {
final Cursor cursor = ((ObjectCursor) mData).getCursor(dataPosition);
final ParcelableStatusCursorIndices indices = (ParcelableStatusCursorIndices) ((ObjectCursor) mData).getIndices();
return cursor.getLong(indices.timestamp);
}
return mData.get(dataPosition).timestamp;
}
@Override @Override
public UserKey getAccountKey(int adapterPosition) { public UserKey getAccountKey(int adapterPosition) {
int dataPosition = adapterPosition - getStatusStartIndex(); int dataPosition = adapterPosition - getStatusStartIndex();

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.adapter;
import android.content.Context; import android.content.Context;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -109,9 +110,10 @@ public class ParcelableUsersAdapter extends LoadMoreSupportAdapter<RecyclerView.
return start; return start;
} }
@Nullable
@Override @Override
public long getUserId(int position) { public String getUserId(int position) {
if (position == getUserCount()) return -1; if (position == getUserCount()) return null;
return mData.get(position).key.getId(); return mData.get(position).key.getId();
} }
@ -129,11 +131,11 @@ public class ParcelableUsersAdapter extends LoadMoreSupportAdapter<RecyclerView.
return true; return true;
} }
public int findPosition(UserKey accountKey, long userId) { public int findPosition(UserKey accountKey, String userId) {
if (mData == null) return RecyclerView.NO_POSITION; if (mData == null) return RecyclerView.NO_POSITION;
for (int i = getUserStartIndex(), j = i + getUserCount(); i < j; i++) { for (int i = getUserStartIndex(), j = i + getUserCount(); i < j; i++) {
final ParcelableUser user = mData.get(i); final ParcelableUser user = mData.get(i);
if (user.account_key.equals(accountKey) && user.key.getId() == userId) { if (user.account_key.equals(accountKey) && TextUtils.equals(user.key.getId(), userId)) {
return i; return i;
} }
} }

View File

@ -28,6 +28,7 @@ import android.widget.TextView;
import org.mariotaku.twidere.api.twitter.model.ResponseList; import org.mariotaku.twidere.api.twitter.model.ResponseList;
import org.mariotaku.twidere.api.twitter.model.SavedSearch; import org.mariotaku.twidere.api.twitter.model.SavedSearch;
import org.mariotaku.twidere.model.UserKey;
/** /**
* Created by mariotaku on 15/4/29. * Created by mariotaku on 15/4/29.
@ -77,7 +78,7 @@ public class SavedSearchesAdapter extends BaseAdapter {
notifyDataSetChanged(); notifyDataSetChanged();
} }
public boolean removeItem(long accountId, long searchId) { public boolean removeItem(UserKey accountId, long searchId) {
if (mData == null) return false; if (mData == null) return false;
for (int i = 0, mDataSize = mData.size(); i < mDataSize; i++) { for (int i = 0, mDataSize = mData.size(); i < mDataSize; i++) {
SavedSearch search = mData.get(i); SavedSearch search = mData.get(i);

View File

@ -20,12 +20,14 @@
package org.mariotaku.twidere.adapter; package org.mariotaku.twidere.adapter;
import android.content.Context; import android.content.Context;
import android.support.annotation.NonNull;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IBaseAdapter; import org.mariotaku.twidere.adapter.iface.IBaseAdapter;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder; import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder;
import java.util.List; import java.util.List;
@ -91,10 +93,17 @@ public class SimpleParcelableUsersAdapter extends BaseArrayAdapter<ParcelableUse
} }
if (data == null) return; if (data == null) return;
for (final ParcelableUser user : data) { for (final ParcelableUser user : data) {
if (clearOld || findItemPosition(user.key.getId()) < 0) { if (clearOld || findUserPosition(user.key) < 0) {
add(user); add(user);
} }
} }
} }
public int findUserPosition(@NonNull UserKey userKey) {
for (int i = 0, j = getCount(); i < j; i++) {
if (userKey.equals(getItem(i).key)) return i;
}
return -1;
}
} }

View File

@ -27,6 +27,8 @@ public interface IStatusesAdapter<Data> extends IContentCardAdapter, IGapSupport
@Nullable @Nullable
String getStatusId(int position); String getStatusId(int position);
long getStatusTimestamp(int adapterPosition);
@Nullable @Nullable
UserKey getAccountKey(int position); UserKey getAccountKey(int position);

View File

@ -33,7 +33,8 @@ public interface IUsersAdapter<Data> extends IContentCardAdapter {
ParcelableUser getUser(int position); ParcelableUser getUser(int position);
long getUserId(int position); @Nullable
String getUserId(int position);
int getUserCount(); int getUserCount();

View File

@ -109,7 +109,7 @@ public abstract class AbsActivitiesFragment extends AbsContentListRecyclerViewFr
if (timestamp != mFirstVisibleTimestamp || !accountKey.equals(mFirstVisibleAccountId)) { if (timestamp != mFirstVisibleTimestamp || !accountKey.equals(mFirstVisibleAccountId)) {
if (mRecords == null) mRecords = new ArrayList<>(); if (mRecords == null) mRecords = new ArrayList<>();
final long time = System.currentTimeMillis(); final long time = System.currentTimeMillis();
mRecords.add(ScrollRecord.create(timestamp, accountKey, time, mRecords.add(ScrollRecord.create(String.valueOf(timestamp), accountKey, time,
TimeZone.getDefault().getOffset(time), mScrollState)); TimeZone.getDefault().getOffset(time), mScrollState));
} }
mFirstVisibleTimestamp = timestamp; mFirstVisibleTimestamp = timestamp;
@ -341,7 +341,7 @@ public abstract class AbsActivitiesFragment extends AbsContentListRecyclerViewFr
final ParcelableActivitiesAdapter adapter = getAdapter(); final ParcelableActivitiesAdapter adapter = getAdapter();
final ParcelableActivity activity = adapter.getActivity(position); final ParcelableActivity activity = adapter.getActivity(position);
final UserKey[] accountIds = {activity.account_key}; final UserKey[] accountIds = {activity.account_key};
final long[] maxIds = {activity.min_position}; final String[] maxIds = {activity.min_position};
getActivities(new BaseRefreshTaskParam(accountIds, maxIds, null)); getActivities(new BaseRefreshTaskParam(accountIds, maxIds, null));
} }

View File

@ -32,6 +32,7 @@ import android.support.v4.content.Loader;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.OnScrollListener; import android.support.v7.widget.RecyclerView.OnScrollListener;
import android.text.TextUtils;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -72,6 +73,7 @@ import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.TimeZone; import java.util.TimeZone;
import edu.tsinghua.hotmobi.HotMobiLogger; import edu.tsinghua.hotmobi.HotMobiLogger;
@ -89,7 +91,7 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
private final OnScrollListener mHotMobiScrollTracker = new OnScrollListener() { private final OnScrollListener mHotMobiScrollTracker = new OnScrollListener() {
public List<ScrollRecord> mRecords; public List<ScrollRecord> mRecords;
private long mFirstVisibleId = -1; private String mFirstVisibleId;
private UserKey mFirstVisibleAccountId = null; private UserKey mFirstVisibleAccountId = null;
private int mFirstVisiblePosition = -1; private int mFirstVisiblePosition = -1;
private int mScrollState; private int mScrollState;
@ -103,9 +105,9 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
final ParcelableStatusesAdapter adapter = (ParcelableStatusesAdapter) recyclerView.getAdapter(); final ParcelableStatusesAdapter adapter = (ParcelableStatusesAdapter) recyclerView.getAdapter();
final ParcelableStatus status = adapter.getStatus(firstVisiblePosition); final ParcelableStatus status = adapter.getStatus(firstVisiblePosition);
if (status != null) { if (status != null) {
final long id = status.id; final String id = status.id;
final UserKey accountId = status.account_key; final UserKey accountId = status.account_key;
if (id != mFirstVisibleId || !accountId.equals(mFirstVisibleAccountId)) { if (!TextUtils.equals(id, mFirstVisibleId) || !accountId.equals(mFirstVisibleAccountId)) {
if (mRecords == null) mRecords = new ArrayList<>(); if (mRecords == null) mRecords = new ArrayList<>();
final long time = System.currentTimeMillis(); final long time = System.currentTimeMillis();
mRecords.add(ScrollRecord.create(id, accountId, time, mRecords.add(ScrollRecord.create(id, accountId, time,
@ -248,7 +250,7 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
final ParcelableStatusesAdapter adapter = getAdapter(); final ParcelableStatusesAdapter adapter = getAdapter();
final boolean rememberPosition = mPreferences.getBoolean(KEY_REMEMBER_POSITION, false); final boolean rememberPosition = mPreferences.getBoolean(KEY_REMEMBER_POSITION, false);
final boolean readFromBottom = mPreferences.getBoolean(KEY_READ_FROM_BOTTOM, false); final boolean readFromBottom = mPreferences.getBoolean(KEY_READ_FROM_BOTTOM, false);
long lastReadId; long lastReadTimestamp;
final int lastVisiblePos, lastVisibleTop; final int lastVisiblePos, lastVisibleTop;
final String tag = getCurrentReadPositionTag(); final String tag = getCurrentReadPositionTag();
final LinearLayoutManager layoutManager = getLayoutManager(); final LinearLayoutManager layoutManager = getLayoutManager();
@ -261,14 +263,14 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
final int statusStartIndex = adapter.getStatusStartIndex(); final int statusStartIndex = adapter.getStatusStartIndex();
final int statusEndIndex = statusStartIndex + adapter.getStatusCount(); final int statusEndIndex = statusStartIndex + adapter.getStatusCount();
final int lastItemIndex = Math.min(statusEndIndex, lastVisiblePos); final int lastItemIndex = Math.min(statusEndIndex, lastVisiblePos);
lastReadId = adapter.getStatusId(lastItemIndex); lastReadTimestamp = adapter.getStatusTimestamp(lastItemIndex);
final View positionView = layoutManager.findViewByPosition(lastItemIndex); final View positionView = layoutManager.findViewByPosition(lastItemIndex);
lastVisibleTop = positionView != null ? positionView.getTop() : 0; lastVisibleTop = positionView != null ? positionView.getTop() : 0;
} else if (rememberPosition && tag != null) { } else if (rememberPosition && tag != null) {
lastReadId = mReadStateManager.getPosition(tag); lastReadTimestamp = mReadStateManager.getPosition(tag);
lastVisibleTop = 0; lastVisibleTop = 0;
} else { } else {
lastReadId = -1; lastReadTimestamp = -1;
lastVisibleTop = 0; lastVisibleTop = 0;
} }
adapter.setData(data); adapter.setData(data);
@ -276,10 +278,10 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
// The last status is statusEndExclusiveIndex - 1 // The last status is statusEndExclusiveIndex - 1
final int statusEndExclusiveIndex = statusStartIndex + adapter.getStatusCount(); final int statusEndExclusiveIndex = statusStartIndex + adapter.getStatusCount();
if (statusEndExclusiveIndex >= 0 && rememberPosition && tag != null) { if (statusEndExclusiveIndex >= 0 && rememberPosition && tag != null) {
final long lastItemId = adapter.getStatusId(statusEndExclusiveIndex - 1); final long lastItemId = adapter.getStatusTimestamp(statusEndExclusiveIndex - 1);
// Status corresponds to last read id was deleted, use last item id instead // Status corresponds to last read id was deleted, use last item id instead
if (lastItemId > 0 && lastReadId > 0 && lastReadId < lastItemId) { if (lastItemId != -1 && lastReadTimestamp > 0 && lastReadTimestamp < lastItemId) {
lastReadId = lastItemId; lastReadTimestamp = lastItemId;
} }
} }
setRefreshEnabled(true); setRefreshEnabled(true);
@ -295,7 +297,7 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
for (int i = statusStartIndex; i < statusEndExclusiveIndex; i++) { for (int i = statusStartIndex; i < statusEndExclusiveIndex; i++) {
// Assume statuses are descend sorted by id, so break at first status with id // Assume statuses are descend sorted by id, so break at first status with id
// lesser equals than read position // lesser equals than read position
if (lastReadId != -1 && adapter.getStatusId(i) <= lastReadId) { if (lastReadTimestamp != -1 && adapter.getStatusTimestamp(i) <= lastReadTimestamp) {
pos = i; pos = i;
break; break;
} }
@ -330,7 +332,7 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
final ParcelableStatus status = adapter.getStatus(position); final ParcelableStatus status = adapter.getStatus(position);
if (status == null) return; if (status == null) return;
final UserKey[] accountIds = {status.account_key}; final UserKey[] accountIds = {status.account_key};
final long[] maxIds = {status.id}; final String[] maxIds = {status.id};
getStatuses(new BaseRefreshTaskParam(accountIds, maxIds, null)); getStatuses(new BaseRefreshTaskParam(accountIds, maxIds, null));
} }
@ -540,8 +542,8 @@ public abstract class AbsStatusesFragment extends AbsContentListRecyclerViewFrag
final ParcelableStatusesAdapter adapter = getAdapter(); final ParcelableStatusesAdapter adapter = getAdapter();
final ParcelableStatus status = adapter.getStatus(position); final ParcelableStatus status = adapter.getStatus(position);
if (status == null) return; if (status == null) return;
mReadStateManager.setPosition(readPositionTag, status.id); mReadStateManager.setPosition(readPositionTag, status.timestamp);
mReadStateManager.setPosition(getCurrentReadPositionTag(), status.id, true); mReadStateManager.setPosition(getCurrentReadPositionTag(), status.timestamp, true);
} }
@NonNull @NonNull

View File

@ -89,7 +89,7 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
private RecyclerViewNavigationHelper mNavigationHelper; private RecyclerViewNavigationHelper mNavigationHelper;
// Data fields // Data fields
private final SimpleArrayMap<UserKey, Set<Long>> mUnreadCountsToRemove = new SimpleArrayMap<>(); private final SimpleArrayMap<UserKey, Set<String>> mUnreadCountsToRemove = new SimpleArrayMap<>();
private final Set<Integer> mReadPositions = Collections.synchronizedSet(new HashSet<Integer>()); private final Set<Integer> mReadPositions = Collections.synchronizedSet(new HashSet<Integer>());
private int mFirstVisibleItem; private int mFirstVisibleItem;
@ -121,7 +121,7 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
return twitter != null && (twitter.isReceivedDirectMessagesRefreshing() || twitter.isSentDirectMessagesRefreshing()); return twitter != null && (twitter.isReceivedDirectMessagesRefreshing() || twitter.isSentDirectMessagesRefreshing());
} }
public final SimpleArrayMap<UserKey, Set<Long>> getUnreadCountsToRemove() { public final SimpleArrayMap<UserKey, Set<String>> getUnreadCountsToRemove() {
return mUnreadCountsToRemove; return mUnreadCountsToRemove;
} }
@ -243,8 +243,8 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
final Context context = getContext(); final Context context = getContext();
if (context == null) return null; if (context == null) return null;
UserKey[] accountIds = getAccountKeys(); UserKey[] accountIds = getAccountKeys();
long[] ids = DataStoreUtils.getNewestMessageIds(context, String[] ids = DataStoreUtils.getNewestMessageIds(context,
DirectMessages.Inbox.CONTENT_URI, accountIds); Inbox.CONTENT_URI, accountIds);
return new BaseRefreshTaskParam(accountIds, ids, null); return new BaseRefreshTaskParam(accountIds, ids, null);
} }
@ -325,9 +325,9 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
public void openNewMessageConversation() { public void openNewMessageConversation() {
final UserKey[] accountIds = getAccountKeys(); final UserKey[] accountIds = getAccountKeys();
if (accountIds.length == 1) { if (accountIds.length == 1) {
IntentUtils.openMessageConversation(getActivity(), accountIds[0], -1); IntentUtils.openMessageConversation(getActivity(), accountIds[0], null);
} else { } else {
IntentUtils.openMessageConversation(getActivity(), null, -1); IntentUtils.openMessageConversation(getActivity(), null, null);
} }
} }
@ -368,13 +368,13 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
mFirstVisibleItem = firstVisibleItem; mFirstVisibleItem = firstVisibleItem;
} }
private void addUnreadCountsToRemove(final UserKey accountId, final long id) { private void addUnreadCountsToRemove(final UserKey accountId, final String id) {
if (mUnreadCountsToRemove.indexOfKey(accountId) < 0) { if (mUnreadCountsToRemove.indexOfKey(accountId) < 0) {
final Set<Long> counts = new HashSet<>(); final Set<String> counts = new HashSet<>();
counts.add(id); counts.add(id);
mUnreadCountsToRemove.put(accountId, counts); mUnreadCountsToRemove.put(accountId, counts);
} else { } else {
final Set<Long> counts = mUnreadCountsToRemove.get(accountId); final Set<String> counts = mUnreadCountsToRemove.get(accountId);
counts.add(id); counts.add(id);
} }
} }
@ -431,7 +431,7 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
protected Object doInBackground(final Object... params) { protected Object doInBackground(final Object... params) {
for (final int pos : read_positions) { for (final int pos : read_positions) {
final DirectMessageEntry entry = adapter.getEntry(pos); final DirectMessageEntry entry = adapter.getEntry(pos);
final long id = entry.conversation_id; final String id = entry.conversation_id;
final UserKey accountKey = entry.account_key; final UserKey accountKey = entry.account_key;
fragment.addUnreadCountsToRemove(accountKey, id); fragment.addUnreadCountsToRemove(accountKey, id);
} }

View File

@ -288,11 +288,11 @@ public class DraftsFragment extends BaseSupportFragment implements Constants, Lo
} }
case Draft.Action.SEND_DIRECT_MESSAGE_COMPAT: case Draft.Action.SEND_DIRECT_MESSAGE_COMPAT:
case Draft.Action.SEND_DIRECT_MESSAGE: { case Draft.Action.SEND_DIRECT_MESSAGE: {
long recipientId = -1; String recipientId = null;
if (item.action_extras instanceof SendDirectMessageActionExtra) { if (item.action_extras instanceof SendDirectMessageActionExtra) {
recipientId = ((SendDirectMessageActionExtra) item.action_extras).getRecipientId(); recipientId = ((SendDirectMessageActionExtra) item.action_extras).getRecipientId();
} }
if (ArrayUtils.isEmpty(item.account_ids) || recipientId <= 0) { if (ArrayUtils.isEmpty(item.account_ids) || recipientId == null) {
continue; continue;
} }
final UserKey accountId = item.account_ids[0]; final UserKey accountId = item.account_ids[0];

View File

@ -305,11 +305,15 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
recipient = args.getParcelable(EXTRA_USER); recipient = args.getParcelable(EXTRA_USER);
} else if (args.containsKey(EXTRA_ACCOUNT_KEY)) { } else if (args.containsKey(EXTRA_ACCOUNT_KEY)) {
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long userId = args.getLong(EXTRA_RECIPIENT_ID, -1); if (accountKey == null) {
final int accountPos = accountsSpinnerAdapter.findItemPosition(accountKey.getId()); getActivity().finish();
return;
}
final int accountPos = accountsSpinnerAdapter.findPositionByKey(accountKey);
if (accountPos >= 0) { if (accountPos >= 0) {
mAccountSpinner.setSelection(accountPos); mAccountSpinner.setSelection(accountPos);
} }
final String userId = args.getString(EXTRA_RECIPIENT_ID);
account = accountPos >= 0 ? accountsSpinnerAdapter.getItem(accountPos) : account = accountPos >= 0 ? accountsSpinnerAdapter.getItem(accountPos) :
ParcelableCredentialsUtils.getCredentials(activity, accountKey); ParcelableCredentialsUtils.getCredentials(activity, accountKey);
recipient = Utils.getUserForConversation(activity, accountKey, userId); recipient = Utils.getUserForConversation(activity, accountKey, userId);
@ -319,7 +323,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
} }
showConversation(account, recipient); showConversation(account, recipient);
if (account != null && recipient != null) { if (account != null && recipient != null) {
final String key = getDraftsTextKey(account.account_key, recipient.key.getId()); final String key = getDraftsTextKey(account.account_key, recipient.key);
mEditText.setText(mMessageDrafts.getString(key, null)); mEditText.setText(mMessageDrafts.getString(key, null));
} }
} }
@ -373,7 +377,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
final ParcelableCredentials account = mAccount; final ParcelableCredentials account = mAccount;
final ParcelableUser recipient = mRecipient; final ParcelableUser recipient = mRecipient;
if (account != null && recipient != null) { if (account != null && recipient != null) {
final String key = getDraftsTextKey(account.account_key, recipient.key.getId()); final String key = getDraftsTextKey(account.account_key, recipient.key);
final SharedPreferences.Editor editor = mMessageDrafts.edit(); final SharedPreferences.Editor editor = mMessageDrafts.edit();
final String text = ParseUtils.parseString(mEditText.getText()); final String text = ParseUtils.parseString(mEditText.getText());
if (TextUtils.isEmpty(text)) { if (TextUtils.isEmpty(text)) {
@ -568,7 +572,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
final LoaderManager lm = getLoaderManager(); final LoaderManager lm = getLoaderManager();
final Bundle args = new Bundle(); final Bundle args = new Bundle();
args.putParcelable(EXTRA_ACCOUNT_KEY, account.account_key); args.putParcelable(EXTRA_ACCOUNT_KEY, account.account_key);
args.putLong(EXTRA_RECIPIENT_ID, recipient.key.getId()); args.putString(EXTRA_RECIPIENT_ID, recipient.key.getId());
if (mLoaderInitialized) { if (mLoaderInitialized) {
lm.restartLoader(0, args, this); lm.restartLoader(0, args, this);
} else { } else {
@ -585,8 +589,8 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
return mConversationContainer.getVisibility() == View.VISIBLE; return mConversationContainer.getVisibility() == View.VISIBLE;
} }
private String getDraftsTextKey(UserKey accountKey, long userId) { private String getDraftsTextKey(UserKey accountKey, UserKey userId) {
return String.format(Locale.ROOT, "text_%s_to_%d", accountKey, userId); return String.format(Locale.ROOT, "text_%s_to_%s", accountKey, userId);
} }
private void searchUsers(UserKey accountKey, String query, boolean fromCache) { private void searchUsers(UserKey accountKey, String query, boolean fromCache) {
@ -748,7 +752,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
final Menu menu = mPopupMenu.getMenu(); final Menu menu = mPopupMenu.getMenu();
final MenuItem view_profile_item = menu.findItem(R.id.view_profile); final MenuItem view_profile_item = menu.findItem(R.id.view_profile);
if (view_profile_item != null && dm != null) { if (view_profile_item != null && dm != null) {
view_profile_item.setVisible(dm.account_key.getId() != dm.sender_id); view_profile_item.setVisible(!TextUtils.equals(dm.account_key.getId(), dm.sender_id));
} }
mPopupMenu.setOnMenuItemClickListener(this); mPopupMenu.setOnMenuItemClickListener(this);
mPopupMenu.show(); mPopupMenu.show();

View File

@ -24,6 +24,7 @@ import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.LoaderManager; import android.support.v4.app.LoaderManager;
import android.text.TextUtils;
import com.squareup.otto.Subscribe; import com.squareup.otto.Subscribe;
@ -50,19 +51,19 @@ import java.util.Set;
*/ */
public abstract class ParcelableStatusesFragment extends AbsStatusesFragment { public abstract class ParcelableStatusesFragment extends AbsStatusesFragment {
private long mLastId; private String mLastId;
private int mPage = 1, mPageDelta; private int mPage = 1, mPageDelta;
public final void deleteStatus(final long statusId) { public final void deleteStatus(@NonNull final String statusId) {
final List<ParcelableStatus> list = getAdapterData(); final List<ParcelableStatus> list = getAdapterData();
if (statusId <= 0 || list == null) return; if (list == null) return;
final Set<ParcelableStatus> dataToRemove = new HashSet<>(); final Set<ParcelableStatus> dataToRemove = new HashSet<>();
for (int i = 0, j = list.size(); i < j; i++) { for (int i = 0, j = list.size(); i < j; i++) {
final ParcelableStatus status = list.get(i); final ParcelableStatus status = list.get(i);
if (status.id == statusId || status.retweet_id > 0 && status.retweet_id == statusId) { if (TextUtils.equals(status.id, statusId) || TextUtils.equals(status.retweet_id, statusId)) {
dataToRemove.add(status); dataToRemove.add(status);
} else if (status.my_retweet_id == statusId) { } else if (TextUtils.equals(status.my_retweet_id, statusId)) {
status.my_retweet_id = -1; status.my_retweet_id = null;
status.retweet_count = status.retweet_count - 1; status.retweet_count = status.retweet_count - 1;
} }
} }
@ -81,14 +82,14 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment {
@Override @Override
public boolean getStatuses(RefreshTaskParam param) { public boolean getStatuses(RefreshTaskParam param) {
final Bundle args = new Bundle(getArguments()); final Bundle args = new Bundle(getArguments());
long[] maxIds = param.getMaxIds(); String[] maxIds = param.getMaxIds();
if (maxIds != null) { if (maxIds != null) {
args.putLong(EXTRA_MAX_ID, maxIds[0]); args.putString(EXTRA_MAX_ID, maxIds[0]);
args.putBoolean(EXTRA_MAKE_GAP, false); args.putBoolean(EXTRA_MAKE_GAP, false);
} }
long[] sinceIds = param.getSinceIds(); String[] sinceIds = param.getSinceIds();
if (sinceIds != null) { if (sinceIds != null) {
args.putLong(EXTRA_SINCE_ID, sinceIds[0]); args.putString(EXTRA_SINCE_ID, sinceIds[0]);
} }
if (mPage > 0) { if (mPage > 0) {
args.putInt(EXTRA_PAGE, mPage); args.putInt(EXTRA_PAGE, mPage);
@ -113,7 +114,7 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment {
@Override @Override
protected boolean hasMoreData(List<ParcelableStatus> list) { protected boolean hasMoreData(List<ParcelableStatus> list) {
if (list == null || list.isEmpty()) return false; if (list == null || list.isEmpty()) return false;
return (mLastId != (mLastId = list.get(list.size() - 1).id)); return (!TextUtils.equals(mLastId, mLastId = list.get(list.size() - 1).id));
} }
@Override @Override
@ -151,7 +152,7 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment {
final ParcelableStatus status = adapter.getStatus(adapter.getStatusStartIndex() + final ParcelableStatus status = adapter.getStatus(adapter.getStatusStartIndex() +
adapter.getStatusCount() - 1); adapter.getStatusCount() - 1);
UserKey[] accountKeys = {status.account_key}; UserKey[] accountKeys = {status.account_key};
final long[] maxIds = {status.id}; final String[] maxIds = {status.id};
mPage += mPageDelta; mPage += mPageDelta;
getStatuses(new BaseRefreshTaskParam(accountKeys, maxIds, null)); getStatuses(new BaseRefreshTaskParam(accountKeys, maxIds, null));
} }
@ -173,7 +174,7 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment {
final IStatusesAdapter<List<ParcelableStatus>> adapter = getAdapter(); final IStatusesAdapter<List<ParcelableStatus>> adapter = getAdapter();
final UserKey[] accountIds = getAccountKeys(); final UserKey[] accountIds = getAccountKeys();
if (adapter.getStatusCount() > 0) { if (adapter.getStatusCount() > 0) {
final long[] sinceIds = new long[]{adapter.getStatus(0).id}; final String[] sinceIds = new String[]{adapter.getStatus(0).id};
getStatuses(new BaseRefreshTaskParam(accountIds, null, sinceIds)); getStatuses(new BaseRefreshTaskParam(accountIds, null, sinceIds));
} else { } else {
getStatuses(new BaseRefreshTaskParam(accountIds, null, null)); getStatuses(new BaseRefreshTaskParam(accountIds, null, null));
@ -211,10 +212,10 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment {
private void updateRetweetedStatuses(ParcelableStatus status) { private void updateRetweetedStatuses(ParcelableStatus status) {
final List<ParcelableStatus> data = getAdapterData(); final List<ParcelableStatus> data = getAdapterData();
if (status == null || status.retweet_id <= 0 || data == null) return; if (status == null || status.retweet_id == null || data == null) return;
for (int i = 0, j = data.size(); i < j; i++) { for (int i = 0, j = data.size(); i < j; i++) {
final ParcelableStatus orig = data.get(i); final ParcelableStatus orig = data.get(i);
if (orig.account_key.equals(status.account_key) && orig.id == status.retweet_id) { if (orig.account_key.equals(status.account_key) && TextUtils.equals(orig.id, status.retweet_id)) {
orig.my_retweet_id = status.my_retweet_id; orig.my_retweet_id = status.my_retweet_id;
orig.retweet_count = status.retweet_count; orig.retweet_count = status.retweet_count;
} }

View File

@ -92,7 +92,7 @@ public abstract class ParcelableUsersFragment extends AbsContentListRecyclerView
setLoadMoreIndicatorPosition(IndicatorPosition.NONE); setLoadMoreIndicatorPosition(IndicatorPosition.NONE);
} }
protected void removeUsers(long... ids) { protected void removeUsers(String... ids) {
//TODO remove from adapter //TODO remove from adapter
} }

View File

@ -181,7 +181,7 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
mPopupMenu.inflate(R.menu.menu_dialog_comment); mPopupMenu.inflate(R.menu.menu_dialog_comment);
final Menu menu = mPopupMenu.getMenu(); final Menu menu = mPopupMenu.getMenu();
MenuUtils.setMenuItemAvailability(menu, R.id.quote_original_status, MenuUtils.setMenuItemAvailability(menu, R.id.quote_original_status,
status.retweet_id > 0 || status.quoted_id > 0); status.retweet_id != null || status.quoted_id != null);
mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {

View File

@ -25,8 +25,8 @@ import android.support.annotation.NonNull;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
import org.mariotaku.twidere.loader.support.RetweetsOfMeLoader; import org.mariotaku.twidere.loader.support.RetweetsOfMeLoader;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.UserKey;
import java.util.List; import java.util.List;
@ -39,8 +39,8 @@ public class RetweetsOfMeFragment extends ParcelableStatusesFragment {
final Bundle args, final Bundle args,
final boolean fromUser) { final boolean fromUser) {
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long maxId = args.getLong(EXTRA_MAX_ID, -1); final String maxId = args.getString(EXTRA_MAX_ID);
final long sinceId = args.getLong(EXTRA_SINCE_ID, -1); final String sinceId = args.getString(EXTRA_SINCE_ID);
final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1); final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1);
return new RetweetsOfMeLoader(context, accountKey, sinceId, maxId, getAdapterData(), return new RetweetsOfMeLoader(context, accountKey, sinceId, maxId, getAdapterData(),
getSavedStatusesFileArgs(), tabPosition, fromUser); getSavedStatusesFileArgs(), tabPosition, fromUser);

View File

@ -135,6 +135,6 @@ public class SavedSearchesListFragment extends AbsContentListViewFragment<SavedS
@Subscribe @Subscribe
public void onSavedSearchDestroyed(SavedSearchDestroyedEvent event) { public void onSavedSearchDestroyed(SavedSearchDestroyedEvent event) {
SavedSearchesAdapter adapter = getAdapter(); SavedSearchesAdapter adapter = getAdapter();
adapter.removeItem(event.getAccountKey().getId(), event.getSearchId()); adapter.removeItem(event.getAccountKey(), event.getSearchId());
} }
} }

View File

@ -61,8 +61,8 @@ public class ScheduledStatusesFragment extends AbsContentListRecyclerViewFragmen
@Override @Override
public Loader<List<ScheduledStatus>> onCreateLoader(int id, Bundle args) { public Loader<List<ScheduledStatus>> onCreateLoader(int id, Bundle args) {
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long sinceId = args.getLong(EXTRA_SINCE_ID, -1); final String sinceId = args.getString(EXTRA_SINCE_ID);
final long maxId = args.getLong(EXTRA_MAX_ID, -1); final String maxId = args.getString(EXTRA_MAX_ID);
final String[] states = {ScheduledStatus.State.SCHEDULED, ScheduledStatus.State.FAILED}; final String[] states = {ScheduledStatus.State.SCHEDULED, ScheduledStatus.State.FAILED};
return new ScheduledStatusesLoader(getActivity(), accountKey, sinceId, maxId, states, null); return new ScheduledStatusesLoader(getActivity(), accountKey, sinceId, maxId, states, null);
} }
@ -91,13 +91,11 @@ public class ScheduledStatusesFragment extends AbsContentListRecyclerViewFragmen
public static class ScheduledStatusesAdapter extends LoadMoreSupportAdapter<RecyclerView.ViewHolder> { public static class ScheduledStatusesAdapter extends LoadMoreSupportAdapter<RecyclerView.ViewHolder> {
public static final int ITEM_VIEW_TYPE_SCHEDULED_STATUS = 2; public static final int ITEM_VIEW_TYPE_SCHEDULED_STATUS = 2;
private final Context mContext;
private final LayoutInflater mInflater; private final LayoutInflater mInflater;
private List<ScheduledStatus> mData; private List<ScheduledStatus> mData;
public ScheduledStatusesAdapter(Context context) { public ScheduledStatusesAdapter(Context context) {
super(context); super(context);
mContext = context;
mInflater = LayoutInflater.from(context); mInflater = LayoutInflater.from(context);
setLoadMoreSupportedPosition(IndicatorPosition.NONE); setLoadMoreSupportedPosition(IndicatorPosition.NONE);
} }

View File

@ -32,7 +32,7 @@ public class StatusFavoritersListFragment extends CursorSupportUsersListFragment
@Override @Override
public IDsUsersLoader onCreateUsersLoader(final Context context, @NonNull final Bundle args, boolean fromUser) { public IDsUsersLoader onCreateUsersLoader(final Context context, @NonNull final Bundle args, boolean fromUser) {
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long statusId = args.getLong(EXTRA_STATUS_ID, -1); final String statusId = args.getString(EXTRA_STATUS_ID);
final StatusFavoritersLoader loader = new StatusFavoritersLoader(context, accountKey, final StatusFavoritersLoader loader = new StatusFavoritersLoader(context, accountKey,
statusId, getData(), false); statusId, getData(), false);
loader.setCursor(getNextCursor()); loader.setCursor(getNextCursor());

View File

@ -218,8 +218,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
mStatusAdapter.setConversationsLoading(true); mStatusAdapter.setConversationsLoading(true);
mStatusAdapter.updateItemDecoration(); mStatusAdapter.updateItemDecoration();
final ParcelableStatus status = args.getParcelable(EXTRA_STATUS); final ParcelableStatus status = args.getParcelable(EXTRA_STATUS);
final String maxId = args.getLong(EXTRA_MAX_ID, -1); final String maxId = args.getString(EXTRA_MAX_ID);
final String sinceId = args.getLong(EXTRA_SINCE_ID, -1); final String sinceId = args.getString(EXTRA_SINCE_ID);
assert status != null; assert status != null;
final ConversationLoader loader = new ConversationLoader(getActivity(), status, sinceId, final ConversationLoader loader = new ConversationLoader(getActivity(), status, sinceId,
maxId, mStatusAdapter.getData(), true); maxId, mStatusAdapter.getData(), true);
@ -544,7 +544,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
public Loader<SingleResponse<ParcelableStatus>> onCreateLoader(final int id, final Bundle args) { public Loader<SingleResponse<ParcelableStatus>> onCreateLoader(final int id, final Bundle args) {
final Bundle fragmentArgs = getArguments(); final Bundle fragmentArgs = getArguments();
final UserKey accountKey = fragmentArgs.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = fragmentArgs.getParcelable(EXTRA_ACCOUNT_KEY);
final long statusId = fragmentArgs.getLong(EXTRA_STATUS_ID, -1); final String statusId = fragmentArgs.getString(EXTRA_STATUS_ID);
return new ParcelableStatusLoader(getActivity(), false, fragmentArgs, accountKey, statusId); return new ParcelableStatusLoader(getActivity(), false, fragmentArgs, accountKey, statusId);
} }
@ -2086,8 +2086,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
} }
public void setTranslationResult(@Nullable TranslationResult translation) { public void setTranslationResult(@Nullable TranslationResult translation) {
if (mStatus == null || translation == null || InternalTwitterContentUtils.getOriginalId(mStatus) if (mStatus == null || translation == null || !TextUtils.equals(InternalTwitterContentUtils
!= translation.getId()) { .getOriginalId(mStatus), translation.getId())) {
mTranslationResult = null; mTranslationResult = null;
} else { } else {
mTranslationResult = translation; mTranslationResult = translation;

View File

@ -32,7 +32,7 @@ public class StatusRetweetersListFragment extends CursorSupportUsersListFragment
@Override @Override
public IDsUsersLoader onCreateUsersLoader(final Context context, @NonNull final Bundle args, boolean fromUser) { public IDsUsersLoader onCreateUsersLoader(final Context context, @NonNull final Bundle args, boolean fromUser) {
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long statusId = args.getLong(EXTRA_STATUS_ID, -1); final String statusId = args.getString(EXTRA_STATUS_ID);
final StatusRetweetersLoader loader = new StatusRetweetersLoader(context, accountKey, statusId, final StatusRetweetersLoader loader = new StatusRetweetersLoader(context, accountKey, statusId,
getData(), fromUser); getData(), fromUser);
loader.setCursor(getNextCursor()); loader.setCursor(getNextCursor());

View File

@ -53,8 +53,8 @@ public class StatusesSearchFragment extends ParcelableStatusesFragment {
final boolean fromUser) { final boolean fromUser) {
setRefreshing(true); setRefreshing(true);
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long maxId = args.getLong(EXTRA_MAX_ID, -1); final String maxId = args.getString(EXTRA_MAX_ID);
final long sinceId = args.getLong(EXTRA_SINCE_ID, -1); final String sinceId = args.getString(EXTRA_SINCE_ID);
final int page = args.getInt(EXTRA_PAGE, -1); final int page = args.getInt(EXTRA_PAGE, -1);
final String query = args.getString(EXTRA_QUERY); final String query = args.getString(EXTRA_QUERY);
final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1); final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1);

View File

@ -25,8 +25,8 @@ import android.support.annotation.NonNull;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
import org.mariotaku.twidere.loader.support.UserFavoritesLoader; import org.mariotaku.twidere.loader.support.UserFavoritesLoader;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.UserKey;
import java.util.List; import java.util.List;
@ -43,9 +43,9 @@ public class UserFavoritesFragment extends ParcelableStatusesFragment {
final boolean fromUser) { final boolean fromUser) {
setRefreshing(true); setRefreshing(true);
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long maxId = args.getLong(EXTRA_MAX_ID, -1); final String maxId = args.getString(EXTRA_MAX_ID);
final long sinceId = args.getLong(EXTRA_SINCE_ID, -1); final String sinceId = args.getString(EXTRA_SINCE_ID);
final long userId = args.getLong(EXTRA_USER_ID, -1); final String userId = args.getString(EXTRA_USER_ID);
final String screenName = args.getString(EXTRA_SCREEN_NAME); final String screenName = args.getString(EXTRA_SCREEN_NAME);
final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1); final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1);
return new UserFavoritesLoader(context, accountKey, userId, screenName, sinceId, maxId, return new UserFavoritesLoader(context, accountKey, userId, screenName, sinceId, maxId,

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.fragment.support;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.text.TextUtils;
import com.squareup.otto.Subscribe; import com.squareup.otto.Subscribe;
@ -36,9 +37,10 @@ public class UserFollowersFragment extends CursorSupportUsersListFragment {
@Override @Override
public CursorSupportUsersLoader onCreateUsersLoader(final Context context, public CursorSupportUsersLoader onCreateUsersLoader(final Context context,
@NonNull final Bundle args, boolean fromUser) { @NonNull final Bundle args,
final boolean fromUser) {
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long userId = args.getLong(EXTRA_USER_ID, -1); final String userId = args.getString(EXTRA_USER_ID);
final String screenName = args.getString(EXTRA_SCREEN_NAME); final String screenName = args.getString(EXTRA_SCREEN_NAME);
final UserFollowersLoader loader = new UserFollowersLoader(context, accountKey, userId, final UserFollowersLoader loader = new UserFollowersLoader(context, accountKey, userId,
screenName, getData(), fromUser); screenName, getData(), fromUser);
@ -62,11 +64,11 @@ public class UserFollowersFragment extends CursorSupportUsersListFragment {
@Subscribe @Subscribe
public void onUsersBlocked(UsersBlockedEvent event) { public void onUsersBlocked(UsersBlockedEvent event) {
final UserKey accountKey = event.getAccountKey(); final UserKey accountKey = event.getAccountKey();
final String screen_name = getAccountScreenName(getActivity(), accountKey); final String screenName = getAccountScreenName(getActivity(), accountKey);
final Bundle args = getArguments(); final Bundle args = getArguments();
if (args == null) return; if (args == null) return;
if (accountKey != null && accountKey.getId() == args.getLong(EXTRA_USER_ID, -1) || screen_name != null if (accountKey != null && TextUtils.equals(accountKey.getId(), args.getString(EXTRA_USER_ID))
&& screen_name.equalsIgnoreCase(args.getString(EXTRA_SCREEN_NAME))) { || screenName != null && screenName.equalsIgnoreCase(args.getString(EXTRA_SCREEN_NAME))) {
removeUsers(event.getUserIds()); removeUsers(event.getUserIds());
} }
} }

View File

@ -82,7 +82,6 @@ import android.widget.TextView;
import com.squareup.otto.Subscribe; import com.squareup.otto.Subscribe;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity;
@ -1390,7 +1389,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
break; break;
} }
case TwidereLinkify.LINK_TYPE_STATUS: { case TwidereLinkify.LINK_TYPE_STATUS: {
IntentUtils.openStatus(getActivity(), accountKey, NumberUtils.toLong(link, -1)); IntentUtils.openStatus(getActivity(), accountKey, link);
break; break;
} }
} }

View File

@ -33,7 +33,7 @@ public class UserFriendsFragment extends CursorSupportUsersListFragment {
public CursorSupportUsersLoader onCreateUsersLoader(final Context context, public CursorSupportUsersLoader onCreateUsersLoader(final Context context,
@NonNull final Bundle args, boolean fromUser) { @NonNull final Bundle args, boolean fromUser) {
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long userId = args.getLong(EXTRA_USER_ID, -1); final String userId = args.getString(EXTRA_USER_ID);
final String screenName = args.getString(EXTRA_SCREEN_NAME); final String screenName = args.getString(EXTRA_SCREEN_NAME);
final UserFriendsLoader loader = new UserFriendsLoader(context, accountKey, userId, final UserFriendsLoader loader = new UserFriendsLoader(context, accountKey, userId,
screenName, getData(), fromUser); screenName, getData(), fromUser);

View File

@ -406,7 +406,7 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
final ParcelableUserList userList = args.getParcelable(EXTRA_USER_LIST); final ParcelableUserList userList = args.getParcelable(EXTRA_USER_LIST);
assert userList != null; assert userList != null;
tabArgs.putParcelable(EXTRA_ACCOUNT_KEY, userList.account_key); tabArgs.putParcelable(EXTRA_ACCOUNT_KEY, userList.account_key);
tabArgs.putLong(EXTRA_USER_ID, userList.user_key.getId()); tabArgs.putString(EXTRA_USER_ID, userList.user_key.getId());
tabArgs.putString(EXTRA_SCREEN_NAME, userList.user_screen_name); tabArgs.putString(EXTRA_SCREEN_NAME, userList.user_screen_name);
tabArgs.putLong(EXTRA_LIST_ID, userList.id); tabArgs.putLong(EXTRA_LIST_ID, userList.id);
tabArgs.putString(EXTRA_LIST_NAME, userList.name); tabArgs.putString(EXTRA_LIST_NAME, userList.name);

View File

@ -33,9 +33,9 @@ import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.UserList; import org.mariotaku.twidere.api.twitter.model.UserList;
import org.mariotaku.twidere.loader.support.CursorSupportUsersLoader; import org.mariotaku.twidere.loader.support.CursorSupportUsersLoader;
import org.mariotaku.twidere.loader.support.UserListMembersLoader; import org.mariotaku.twidere.loader.support.UserListMembersLoader;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.model.SingleResponse; import org.mariotaku.twidere.model.SingleResponse;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.util.ParcelableUserListUtils; import org.mariotaku.twidere.model.util.ParcelableUserListUtils;
import org.mariotaku.twidere.util.AsyncTaskUtils; import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterAPIFactory;
@ -53,7 +53,7 @@ public class UserListMembersFragment extends CursorSupportUsersListFragment {
if (BROADCAST_USER_LIST_MEMBERS_DELETED.equals(action)) { if (BROADCAST_USER_LIST_MEMBERS_DELETED.equals(action)) {
final ParcelableUserList list = intent.getParcelableExtra(EXTRA_USER_LIST); final ParcelableUserList list = intent.getParcelableExtra(EXTRA_USER_LIST);
if (mUserList != null && list != null && list.id == mUserList.id) { if (mUserList != null && list != null && list.id == mUserList.id) {
removeUsers(intent.getLongArrayExtra(EXTRA_USER_IDS)); removeUsers(intent.getStringExtra(EXTRA_USER_IDS));
} }
} }
} }

View File

@ -25,8 +25,8 @@ import android.support.annotation.NonNull;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
import org.mariotaku.twidere.loader.support.UserListTimelineLoader; import org.mariotaku.twidere.loader.support.UserListTimelineLoader;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.UserKey;
import java.util.List; import java.util.List;
@ -52,9 +52,9 @@ public class UserListTimelineFragment extends ParcelableStatusesFragment {
if (args == null) return null; if (args == null) return null;
final long listId = args.getLong(EXTRA_LIST_ID, -1); final long listId = args.getLong(EXTRA_LIST_ID, -1);
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long maxId = args.getLong(EXTRA_MAX_ID, -1); final String maxId = args.getString(EXTRA_MAX_ID);
final long sinceId = args.getLong(EXTRA_SINCE_ID, -1); final String sinceId = args.getString(EXTRA_SINCE_ID);
final long userId = args.getLong(EXTRA_USER_ID, -1); final String userId = args.getString(EXTRA_USER_ID);
final String screenName = args.getString(EXTRA_SCREEN_NAME); final String screenName = args.getString(EXTRA_SCREEN_NAME);
final String listName = args.getString(EXTRA_LIST_NAME); final String listName = args.getString(EXTRA_LIST_NAME);
final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1); final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1);

View File

@ -23,6 +23,7 @@ import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.DialogFragment; import android.support.v4.app.DialogFragment;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
import android.text.TextUtils;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
@ -32,8 +33,8 @@ import com.squareup.otto.Subscribe;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.ParcelableUserListsAdapter; import org.mariotaku.twidere.adapter.ParcelableUserListsAdapter;
import org.mariotaku.twidere.loader.support.UserListsLoader; import org.mariotaku.twidere.loader.support.UserListsLoader;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.ParcelableUserList; import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.message.UserListDestroyedEvent; import org.mariotaku.twidere.model.message.UserListDestroyedEvent;
import org.mariotaku.twidere.util.MenuUtils; import org.mariotaku.twidere.util.MenuUtils;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
@ -82,8 +83,8 @@ public class UserListsFragment extends ParcelableUserListsFragment {
final MenuItem item = menu.findItem(R.id.new_user_list); final MenuItem item = menu.findItem(R.id.new_user_list);
final UserKey accountId = getAccountKey(); final UserKey accountId = getAccountKey();
if (accountId == null || item == null) return; if (accountId == null || item == null) return;
final long userId = getUserId(); final String userId = getUserId();
if (accountId.getId() == userId) { if (TextUtils.equals(accountId.getId(), userId)) {
MenuUtils.setMenuItemAvailability(menu, R.id.new_user_list, true); MenuUtils.setMenuItemAvailability(menu, R.id.new_user_list, true);
} else { } else {
MenuUtils.setMenuItemAvailability(menu, R.id.new_user_list, Utils.isMyAccount(getActivity(), getScreenName())); MenuUtils.setMenuItemAvailability(menu, R.id.new_user_list, Utils.isMyAccount(getActivity(), getScreenName()));
@ -94,8 +95,8 @@ public class UserListsFragment extends ParcelableUserListsFragment {
return getArguments().getString(EXTRA_SCREEN_NAME); return getArguments().getString(EXTRA_SCREEN_NAME);
} }
private long getUserId() { private String getUserId() {
return getArguments().getLong(EXTRA_USER_ID); return getArguments().getString(EXTRA_USER_ID);
} }
@Override @Override

View File

@ -19,9 +19,9 @@ import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosi
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter; import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.loader.iface.IExtendedLoader; import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.loader.support.MediaTimelineLoader; import org.mariotaku.twidere.loader.support.MediaTimelineLoader;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.util.IntentUtils; import org.mariotaku.twidere.util.IntentUtils;
import org.mariotaku.twidere.view.HeaderDrawerLayout.DrawerCallback; import org.mariotaku.twidere.view.HeaderDrawerLayout.DrawerCallback;
import org.mariotaku.twidere.view.holder.GapViewHolder; import org.mariotaku.twidere.view.holder.GapViewHolder;
@ -72,12 +72,12 @@ public class UserMediaTimelineFragment extends AbsContentRecyclerViewFragment<St
} }
public int getStatuses(final long maxId, final long sinceId) { public int getStatuses(final String maxId, final String sinceId) {
if (getContext() == null) return -1; if (getContext() == null) return -1;
final Bundle args = new Bundle(getArguments()); final Bundle args = new Bundle(getArguments());
args.putBoolean(EXTRA_MAKE_GAP, false); args.putBoolean(EXTRA_MAKE_GAP, false);
args.putLong(EXTRA_MAX_ID, maxId); args.putString(EXTRA_MAX_ID, maxId);
args.putLong(EXTRA_SINCE_ID, sinceId); args.putString(EXTRA_SINCE_ID, sinceId);
args.putBoolean(EXTRA_FROM_USER, true); args.putBoolean(EXTRA_FROM_USER, true);
getLoaderManager().restartLoader(0, args, this); getLoaderManager().restartLoader(0, args, this);
return 0; return 0;
@ -99,9 +99,9 @@ public class UserMediaTimelineFragment extends AbsContentRecyclerViewFragment<St
public Loader<List<ParcelableStatus>> onCreateLoader(int id, Bundle args) { public Loader<List<ParcelableStatus>> onCreateLoader(int id, Bundle args) {
final Context context = getActivity(); final Context context = getActivity();
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long maxId = args.getLong(EXTRA_MAX_ID, -1); final String maxId = args.getString(EXTRA_MAX_ID);
final long sinceId = args.getLong(EXTRA_SINCE_ID, -1); final String sinceId = args.getString(EXTRA_SINCE_ID);
final long userId = args.getLong(EXTRA_USER_ID, -1); final String userId = args.getString(EXTRA_USER_ID);
final String screenName = args.getString(EXTRA_SCREEN_NAME); final String screenName = args.getString(EXTRA_SCREEN_NAME);
final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1); final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1);
final boolean fromUser = args.getBoolean(EXTRA_FROM_USER); final boolean fromUser = args.getBoolean(EXTRA_FROM_USER);
@ -151,8 +151,8 @@ public class UserMediaTimelineFragment extends AbsContentRecyclerViewFragment<St
super.onLoadMoreContents(position); super.onLoadMoreContents(position);
if (position == 0) return; if (position == 0) return;
final IStatusesAdapter<List<ParcelableStatus>> adapter = getAdapter(); final IStatusesAdapter<List<ParcelableStatus>> adapter = getAdapter();
final long maxId = adapter.getStatusId(adapter.getStatusCount() - 1); final String maxId = adapter.getStatusId(adapter.getStatusCount() - 1);
getStatuses(maxId, -1); getStatuses(maxId, null);
} }
@Override @Override

View File

@ -41,8 +41,8 @@ public class UserMentionsFragment extends StatusesSearchFragment {
if (args == null) return null; if (args == null) return null;
final String screenName = args.getString(EXTRA_SCREEN_NAME); final String screenName = args.getString(EXTRA_SCREEN_NAME);
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long maxId = args.getLong(EXTRA_MAX_ID, -1); final String maxId = args.getString(EXTRA_MAX_ID);
final long sinceId = args.getLong(EXTRA_SINCE_ID, -1); final String sinceId = args.getString(EXTRA_SINCE_ID);
final int page = args.getInt(EXTRA_PAGE, -1); final int page = args.getInt(EXTRA_PAGE, -1);
final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1); final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1);
final boolean makeGap = args.getBoolean(EXTRA_MAKE_GAP, true); final boolean makeGap = args.getBoolean(EXTRA_MAKE_GAP, true);

View File

@ -25,8 +25,8 @@ import android.support.annotation.NonNull;
import android.support.v4.content.Loader; import android.support.v4.content.Loader;
import org.mariotaku.twidere.loader.support.UserTimelineLoader; import org.mariotaku.twidere.loader.support.UserTimelineLoader;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.UserKey;
import java.util.List; import java.util.List;
@ -51,9 +51,9 @@ public class UserTimelineFragment extends ParcelableStatusesFragment {
setRefreshing(true); setRefreshing(true);
final List<ParcelableStatus> data = getAdapterData(); final List<ParcelableStatus> data = getAdapterData();
final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final UserKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long maxId = args.getLong(EXTRA_MAX_ID, -1); final String maxId = args.getString(EXTRA_MAX_ID);
final long sinceId = args.getLong(EXTRA_SINCE_ID, -1); final String sinceId = args.getString(EXTRA_SINCE_ID);
final long userId = args.getLong(EXTRA_USER_ID, -1); final String userId = args.getString(EXTRA_USER_ID);
final String screenName = args.getString(EXTRA_SCREEN_NAME); final String screenName = args.getString(EXTRA_SCREEN_NAME);
final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1); final int tabPosition = args.getInt(EXTRA_TAB_POSITION, -1);
return new UserTimelineLoader(context, accountKey, userId, screenName, sinceId, maxId, data, return new UserTimelineLoader(context, accountKey, userId, screenName, sinceId, maxId, data,
@ -78,9 +78,9 @@ public class UserTimelineFragment extends ParcelableStatusesFragment {
StringBuilder sb = new StringBuilder("user_timeline_"); StringBuilder sb = new StringBuilder("user_timeline_");
if (tabPosition < 0) return null; if (tabPosition < 0) return null;
final long userId = args.getLong(EXTRA_USER_ID, -1); final String userId = args.getString(EXTRA_USER_ID);
final String screenName = args.getString(EXTRA_SCREEN_NAME); final String screenName = args.getString(EXTRA_SCREEN_NAME);
if (userId > 0) { if (userId != null) {
sb.append(userId); sb.append(userId);
} else if (screenName != null) { } else if (screenName != null) {
sb.append(screenName); sb.append(screenName);

View File

@ -160,7 +160,7 @@ public class CardPollFragment extends BaseSupportFragment implements
choiceRadioButton.setChecked(checked); choiceRadioButton.setChecked(checked);
if (checked) { if (checked) {
final CardDataMap cardData = new CardDataMap(); final CardDataMap cardData = new CardDataMap();
cardData.putLong("original_tweet_id", status.id); cardData.putLong("original_tweet_id", NumberUtils.toLong(status.id));
cardData.putString("card_uri", card.url); cardData.putString("card_uri", card.url);
cardData.putString("cards_platform", TwitterAPIFactory.CARDS_PLATFORM_ANDROID_12); cardData.putString("cards_platform", TwitterAPIFactory.CARDS_PLATFORM_ANDROID_12);
cardData.putString("response_card_name", card.name); cardData.putString("response_card_name", card.name);

View File

@ -23,6 +23,7 @@ import android.content.Context;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.WorkerThread; import android.support.annotation.WorkerThread;
import android.text.TextUtils;
import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.TwitterException;
@ -40,6 +41,7 @@ import org.mariotaku.twidere.util.Utils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
public class ConversationLoader extends TwitterAPIStatusesLoader { public class ConversationLoader extends TwitterAPIStatusesLoader {
@ -92,7 +94,7 @@ public class ConversationLoader extends TwitterAPIStatusesLoader {
query.sinceId(sinceId != null ? sinceId : status.id); query.sinceId(sinceId != null ? sinceId : status.id);
try { try {
for (Status item : twitter.search(query)) { for (Status item : twitter.search(query)) {
if (item.getInReplyToStatusId() == status.id) { if (TextUtils.equals(item.getInReplyToStatusId(), status.id)) {
statuses.add(item); statuses.add(item);
} }
} }

View File

@ -23,7 +23,9 @@ import android.content.Context;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.WorkerThread; import android.support.annotation.WorkerThread;
import android.text.TextUtils;
import org.apache.commons.lang3.StringUtils;
import org.mariotaku.twidere.api.twitter.Twitter; import org.mariotaku.twidere.api.twitter.Twitter;
import org.mariotaku.twidere.api.twitter.TwitterException; import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.model.Paging;
@ -51,7 +53,7 @@ public class MediaTimelineLoader extends TwitterAPIStatusesLoader {
private User mUser; private User mUser;
public MediaTimelineLoader(final Context context, final UserKey accountKey, final String userId, public MediaTimelineLoader(final Context context, final UserKey accountKey, final String userId,
final String screenName, final long sinceId, final long maxId, final String screenName, final String sinceId, final String maxId,
final List<ParcelableStatus> data, final String[] savedStatusesArgs, final List<ParcelableStatus> data, final String[] savedStatusesArgs,
final int tabPosition, final boolean fromUser) { final int tabPosition, final boolean fromUser) {
super(context, accountKey, sinceId, maxId, data, savedStatusesArgs, tabPosition, fromUser); super(context, accountKey, sinceId, maxId, data, savedStatusesArgs, tabPosition, fromUser);
@ -92,7 +94,8 @@ public class MediaTimelineLoader extends TwitterAPIStatusesLoader {
final ResponseList<Status> result = new ResponseList<>(); final ResponseList<Status> result = new ResponseList<>();
for (Status status : twitter.search(query)) { for (Status status : twitter.search(query)) {
final User user = status.getUser(); final User user = status.getUser();
if (user.getId() == mUserId || user.getScreenName().equalsIgnoreCase(mUserScreenName)) { if (TextUtils.equals(user.getId(), mUserId) ||
StringUtils.endsWithIgnoreCase(user.getScreenName(), mUserScreenName)) {
result.add(status); result.add(status);
} }
} }

View File

@ -42,10 +42,10 @@ public class ParcelableStatusLoader extends AsyncTaskLoader<SingleResponse<Parce
private final boolean mOmitIntentExtra; private final boolean mOmitIntentExtra;
private final Bundle mExtras; private final Bundle mExtras;
private final UserKey mAccountId; private final UserKey mAccountId;
private final long mStatusId; private final String mStatusId;
public ParcelableStatusLoader(final Context context, final boolean omitIntentExtra, final Bundle extras, public ParcelableStatusLoader(final Context context, final boolean omitIntentExtra, final Bundle extras,
final UserKey accountId, final long statusId) { final UserKey accountId, final String statusId) {
super(context); super(context);
mOmitIntentExtra = omitIntentExtra; mOmitIntentExtra = omitIntentExtra;
mExtras = extras; mExtras = extras;

View File

@ -21,6 +21,7 @@ package org.mariotaku.twidere.loader.support;
import android.content.Context; import android.content.Context;
import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.AsyncTaskLoader;
import android.text.TextUtils;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.loader.iface.IExtendedLoader; import org.mariotaku.twidere.loader.iface.IExtendedLoader;
@ -64,9 +65,9 @@ public abstract class ParcelableUsersLoader extends AsyncTaskLoader<List<Parcela
return mData; return mData;
} }
protected boolean hasId(final long id) { protected boolean hasId(final String id) {
for (final ParcelableUser user : mData) { for (final ParcelableUser user : mData) {
if (user.key.getId() == id) return true; if (TextUtils.equals(user.key.getId(), id)) return true;
} }
return false; return false;
} }

View File

@ -40,7 +40,7 @@ import java.util.List;
public class RetweetsOfMeLoader extends TwitterAPIStatusesLoader { public class RetweetsOfMeLoader extends TwitterAPIStatusesLoader {
public RetweetsOfMeLoader(final Context context, final UserKey accountKey, public RetweetsOfMeLoader(final Context context, final UserKey accountKey,
final long sinceId, final long maxId, final String sinceId, final String maxId,
final List<ParcelableStatus> data, final String[] savedStatusesArgs, final List<ParcelableStatus> data, final String[] savedStatusesArgs,
final int tabPosition, boolean fromUser) { final int tabPosition, boolean fromUser) {
super(context, accountKey, sinceId, maxId, data, savedStatusesArgs, tabPosition, fromUser); super(context, accountKey, sinceId, maxId, data, savedStatusesArgs, tabPosition, fromUser);

View File

@ -33,7 +33,7 @@ import java.util.Locale;
public class UserMentionsLoader extends TweetSearchLoader { public class UserMentionsLoader extends TweetSearchLoader {
public UserMentionsLoader(final Context context, final UserKey accountId, final String screenName, public UserMentionsLoader(final Context context, final UserKey accountId, final String screenName,
final long maxId, final long sinceId, int page, final List<ParcelableStatus> data, final String maxId, final String sinceId, int page, final List<ParcelableStatus> data,
final String[] savedStatusesArgs, final int tabPosition, boolean fromUser, final String[] savedStatusesArgs, final int tabPosition, boolean fromUser,
boolean makeGap) { boolean makeGap) {
super(context, accountId, screenName, sinceId, maxId, page, data, savedStatusesArgs, tabPosition, super(context, accountId, screenName, sinceId, maxId, page, data, savedStatusesArgs, tabPosition,

View File

@ -19,16 +19,16 @@ import java.util.Arrays;
@JsonObject @JsonObject
public class TabArguments implements TwidereConstants { public class TabArguments implements TwidereConstants {
@JsonField(name = "account_id") @JsonField(name = "account_id")
long accountId = -1; String accountId = null;
@JsonField(name = "account_keys") @JsonField(name = "account_keys")
UserKey[] accountKeys; UserKey[] accountKeys;
public long getAccountId() { public String getAccountId() {
return accountId; return accountId;
} }
public void setAccountId(long accountId) { public void setAccountId(String accountId) {
this.accountId = accountId; this.accountId = accountId;
} }
@ -42,8 +42,8 @@ public class TabArguments implements TwidereConstants {
@CallSuper @CallSuper
public void copyToBundle(@NonNull Bundle bundle) { public void copyToBundle(@NonNull Bundle bundle) {
if (accountId > 0) { if (accountId != null) {
bundle.putLong(EXTRA_ACCOUNT_ID, accountId); bundle.putString(EXTRA_ACCOUNT_ID, accountId);
} }
} }

View File

@ -26,7 +26,7 @@ public class ParcelableActivityUtils {
* @param followingOnly Limit following users in sources * @param followingOnly Limit following users in sources
* @return true if source ids changed, false otherwise * @return true if source ids changed, false otherwise
*/ */
public static boolean initAfterFilteredSourceIds(ParcelableActivity activity, long[] filteredUserIds, public static boolean initAfterFilteredSourceIds(ParcelableActivity activity, String[] filteredUserIds,
boolean followingOnly) { boolean followingOnly) {
if (activity.after_filtered_source_ids != null) return false; if (activity.after_filtered_source_ids != null) return false;
if (followingOnly || !ArrayUtils.isEmpty(filteredUserIds)) { if (followingOnly || !ArrayUtils.isEmpty(filteredUserIds)) {

View File

@ -2,6 +2,7 @@ package org.mariotaku.twidere.model.util;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.TextUtils;
import org.mariotaku.twidere.api.statusnet.model.Attention; import org.mariotaku.twidere.api.statusnet.model.Attention;
import org.mariotaku.twidere.api.twitter.model.Place; import org.mariotaku.twidere.api.twitter.model.Place;
@ -29,7 +30,7 @@ public class ParcelableStatusUtils {
status.retweeted_by_user_screen_name = null; status.retweeted_by_user_screen_name = null;
status.retweeted_by_user_profile_image = null; status.retweeted_by_user_profile_image = null;
status.retweet_timestamp = -1; status.retweet_timestamp = -1;
status.retweet_id = -1; status.retweet_id = null;
} }
public static ParcelableStatus fromStatus(final Status orig, final UserKey accountKey, public static ParcelableStatus fromStatus(final Status orig, final UserKey accountKey,
@ -134,11 +135,11 @@ public class ParcelableStatusUtils {
} }
private static UserKey getInReplyToUserId(Status status, UserKey accountKey) { private static UserKey getInReplyToUserId(Status status, UserKey accountKey) {
final long inReplyToUserId = status.getInReplyToUserId(); final String inReplyToUserId = status.getInReplyToUserId();
final UserMentionEntity[] entities = status.getUserMentionEntities(); final UserMentionEntity[] entities = status.getUserMentionEntities();
if (entities != null) { if (entities != null) {
for (final UserMentionEntity entity : entities) { for (final UserMentionEntity entity : entities) {
if (inReplyToUserId == entity.getId()) { if (TextUtils.equals(inReplyToUserId, entity.getId())) {
return new UserKey(inReplyToUserId, accountKey.getHost()); return new UserKey(inReplyToUserId, accountKey.getHost());
} }
} }
@ -146,14 +147,13 @@ public class ParcelableStatusUtils {
final Attention[] attentions = status.getAttentions(); final Attention[] attentions = status.getAttentions();
if (attentions != null) { if (attentions != null) {
for (Attention attention : attentions) { for (Attention attention : attentions) {
if (inReplyToUserId == attention.getId()) { if (TextUtils.equals(inReplyToUserId, attention.getId())) {
final String host = UserKeyUtils.getUserHost(attention.getOstatusUri()); final String host = UserKeyUtils.getUserHost(attention.getOstatusUri(),
if (host != null) { accountKey.getHost());
return new UserKey(inReplyToUserId, host); return new UserKey(inReplyToUserId, host);
} }
} }
} }
}
return new UserKey(inReplyToUserId, accountKey.getHost()); return new UserKey(inReplyToUserId, accountKey.getHost());
} }
@ -179,17 +179,19 @@ public class ParcelableStatusUtils {
@NonNull @NonNull
public static String getInReplyToName(@NonNull final Status status) { public static String getInReplyToName(@NonNull final Status status) {
final long inReplyToUserId = status.getInReplyToUserId(); final String inReplyToUserId = status.getInReplyToUserId();
final UserMentionEntity[] entities = status.getUserMentionEntities(); final UserMentionEntity[] entities = status.getUserMentionEntities();
if (entities != null) { if (entities != null) {
for (final UserMentionEntity entity : entities) { for (final UserMentionEntity entity : entities) {
if (inReplyToUserId == entity.getId()) return entity.getName(); if (TextUtils.equals(inReplyToUserId, entity.getId())) return entity.getName();
} }
} }
final Attention[] attentions = status.getAttentions(); final Attention[] attentions = status.getAttentions();
if (attentions != null) { if (attentions != null) {
for (Attention attention : attentions) { for (Attention attention : attentions) {
if (inReplyToUserId == attention.getId()) return attention.getFullName(); if (TextUtils.equals(inReplyToUserId, attention.getId())) {
return attention.getFullName();
}
} }
} }
return status.getInReplyToScreenName(); return status.getInReplyToScreenName();

View File

@ -72,11 +72,6 @@ public class ParcelableUserUtils implements TwidereConstants {
return obj; return obj;
} }
public static String getUserHost(ParcelableUser user) {
if (user.extras == null) return USER_TYPE_TWITTER_COM;
return UserKeyUtils.getUserHost(user.extras.ostatus_uri);
}
public static ParcelableUser fromDirectMessageConversationEntry(final Cursor cursor) { public static ParcelableUser fromDirectMessageConversationEntry(final Cursor cursor) {
final UserKey accountId = UserKey.valueOf(cursor.getString(DirectMessages.ConversationEntries.IDX_ACCOUNT_KEY)); final UserKey accountId = UserKey.valueOf(cursor.getString(DirectMessages.ConversationEntries.IDX_ACCOUNT_KEY));
final UserKey id = UserKey.valueOf(cursor.getString(DirectMessages.ConversationEntries.IDX_CONVERSATION_ID)); final UserKey id = UserKey.valueOf(cursor.getString(DirectMessages.ConversationEntries.IDX_CONVERSATION_ID));

View File

@ -56,14 +56,17 @@ public class UserKeyUtils {
} }
public static String getUserHost(User user) { public static String getUserHost(User user) {
return getUserHost(user.getOstatusUri()); return getUserHost(user.getOstatusUri(), TwidereConstants.USER_TYPE_TWITTER_COM);
} }
@NonNull @NonNull
public static String getUserHost(@Nullable String uri) { public static String getUserHost(@Nullable String uri, @Nullable String def) {
if (uri == null) return TwidereConstants.USER_TYPE_TWITTER_COM; if (def == null) {
def = TwidereConstants.USER_TYPE_TWITTER_COM;
}
if (uri == null) return def;
final String authority = PreviewMediaExtractor.getAuthority(uri); final String authority = PreviewMediaExtractor.getAuthority(uri);
if (authority == null) return TwidereConstants.USER_TYPE_TWITTER_COM; if (authority == null) return def;
return authority.replaceAll("[^\\w\\d\\.]", "-"); return authority.replaceAll("[^\\w\\d\\.]", "-");
} }

View File

@ -34,6 +34,7 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Parcelable; import android.os.Parcelable;
import android.provider.BaseColumns; import android.provider.BaseColumns;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder; import android.support.v4.app.NotificationCompat.Builder;
@ -85,7 +86,6 @@ import org.mariotaku.twidere.model.util.ParcelableDirectMessageUtils;
import org.mariotaku.twidere.model.util.ParcelableLocationUtils; import org.mariotaku.twidere.model.util.ParcelableLocationUtils;
import org.mariotaku.twidere.model.util.ParcelableStatusUpdateUtils; import org.mariotaku.twidere.model.util.ParcelableStatusUpdateUtils;
import org.mariotaku.twidere.model.util.ParcelableStatusUtils; import org.mariotaku.twidere.model.util.ParcelableStatusUtils;
import org.mariotaku.twidere.model.util.ParcelableUserMentionUtils;
import org.mariotaku.twidere.preference.ServicePickerPreference; import org.mariotaku.twidere.preference.ServicePickerPreference;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedHashtags; import org.mariotaku.twidere.provider.TwidereDataStore.CachedHashtags;
import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages; import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages;
@ -121,7 +121,6 @@ import edu.tsinghua.hotmobi.HotMobiLogger;
import edu.tsinghua.hotmobi.model.TimelineType; import edu.tsinghua.hotmobi.model.TimelineType;
import edu.tsinghua.hotmobi.model.TweetEvent; import edu.tsinghua.hotmobi.model.TweetEvent;
import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.ContentValuesCreator.createMessageDraft; import static org.mariotaku.twidere.util.ContentValuesCreator.createMessageDraft;
import static org.mariotaku.twidere.util.Utils.getImagePathFromUri; import static org.mariotaku.twidere.util.Utils.getImagePathFromUri;
import static org.mariotaku.twidere.util.Utils.getImageUploadStatus; import static org.mariotaku.twidere.util.Utils.getImageUploadStatus;
@ -263,11 +262,11 @@ public class BackgroundOperationService extends IntentService implements Constan
} }
case Draft.Action.SEND_DIRECT_MESSAGE_COMPAT: case Draft.Action.SEND_DIRECT_MESSAGE_COMPAT:
case Draft.Action.SEND_DIRECT_MESSAGE: { case Draft.Action.SEND_DIRECT_MESSAGE: {
long recipientId = -1; String recipientId = null;
if (item.action_extras instanceof SendDirectMessageActionExtra) { if (item.action_extras instanceof SendDirectMessageActionExtra) {
recipientId = ((SendDirectMessageActionExtra) item.action_extras).getRecipientId(); recipientId = ((SendDirectMessageActionExtra) item.action_extras).getRecipientId();
} }
if (ArrayUtils.isEmpty(item.account_ids) || recipientId <= 0) { if (ArrayUtils.isEmpty(item.account_ids) || recipientId == null) {
return; return;
} }
final UserKey accountKey = item.account_ids[0]; final UserKey accountKey = item.account_ids[0];
@ -291,14 +290,15 @@ public class BackgroundOperationService extends IntentService implements Constan
private void handleSendDirectMessageIntent(final Intent intent) { private void handleSendDirectMessageIntent(final Intent intent) {
final UserKey accountId = intent.getParcelableExtra(EXTRA_ACCOUNT_KEY); final UserKey accountId = intent.getParcelableExtra(EXTRA_ACCOUNT_KEY);
final long recipientId = intent.getLongExtra(EXTRA_RECIPIENT_ID, -1); final String recipientId = intent.getStringExtra(EXTRA_RECIPIENT_ID);
final String imageUri = intent.getStringExtra(EXTRA_IMAGE_URI);
final String text = intent.getStringExtra(EXTRA_TEXT); final String text = intent.getStringExtra(EXTRA_TEXT);
final String imageUri = intent.getStringExtra(EXTRA_IMAGE_URI);
if (accountId == null || recipientId == null || text == null) return;
sendMessage(accountId, recipientId, text, imageUri); sendMessage(accountId, recipientId, text, imageUri);
} }
private void sendMessage(UserKey accountId, long recipientId, String text, String imageUri) { private void sendMessage(@NonNull UserKey accountId, @NonNull String recipientId,
if (accountId == null || recipientId <= 0 || isEmpty(text)) return; @NonNull String text, @Nullable String imageUri) {
final String title = getString(R.string.sending_direct_message); final String title = getString(R.string.sending_direct_message);
final Builder builder = new Builder(this); final Builder builder = new Builder(this);
builder.setSmallIcon(R.drawable.ic_stat_send); builder.setSmallIcon(R.drawable.ic_stat_send);
@ -314,7 +314,7 @@ public class BackgroundOperationService extends IntentService implements Constan
recipientId, text, imageUri); recipientId, text, imageUri);
final ContentResolver resolver = getContentResolver(); final ContentResolver resolver = getContentResolver();
if (result.getData() != null && result.getData().id > 0) { if (result.getData() != null && result.getData().id != null) {
final ContentValues values = ContentValuesCreator.createDirectMessage(result.getData()); final ContentValues values = ContentValuesCreator.createDirectMessage(result.getData());
final String delete_where = DirectMessages.ACCOUNT_KEY + " = " + accountId + " AND " final String delete_where = DirectMessages.ACCOUNT_KEY + " = " + accountId + " AND "
+ DirectMessages.MESSAGE_ID + " = " + result.getData().id; + DirectMessages.MESSAGE_ID + " = " + result.getData().id;
@ -445,8 +445,10 @@ public class BackgroundOperationService extends IntentService implements Constan
private SingleResponse<ParcelableDirectMessage> sendDirectMessage(final NotificationCompat.Builder builder, private SingleResponse<ParcelableDirectMessage> sendDirectMessage(final NotificationCompat.Builder builder,
final UserKey accountKey, final long recipientId, final UserKey accountKey,
final String text, final String imageUri) { final String recipientId,
final String text,
final String imageUri) {
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(this, accountKey, true, true); final Twitter twitter = TwitterAPIFactory.getTwitterInstance(this, accountKey, true, true);
final TwitterUpload twitterUpload = TwitterAPIFactory.getTwitterInstance(this, accountKey, true, true, TwitterUpload.class); final TwitterUpload twitterUpload = TwitterAPIFactory.getTwitterInstance(this, accountKey, true, true, TwitterUpload.class);
if (twitter == null || twitterUpload == null) return SingleResponse.getInstance(); if (twitter == null || twitterUpload == null) return SingleResponse.getInstance();
@ -690,24 +692,23 @@ public class BackgroundOperationService extends IntentService implements Constan
try { try {
final Status resultStatus = twitter.updateStatus(status); final Status resultStatus = twitter.updateStatus(status);
final ParcelableStatus result = ParcelableStatusUtils.fromStatus(resultStatus,
account.account_key, false);
if (!mentionedHondaJOJO) { if (!mentionedHondaJOJO) {
ParcelableUserMention[] mentions = ParcelableUserMentionUtils.fromUserMentionEntities(resultStatus.getUser(), final ParcelableUserMention[] mentions = result.mentions;
resultStatus.getUserMentionEntities());
if (ArrayUtils.isEmpty(mentions)) { if (ArrayUtils.isEmpty(mentions)) {
mentionedHondaJOJO = statusUpdate.text.contains("@" + HONDAJOJO_SCREEN_NAME); mentionedHondaJOJO = statusUpdate.text.contains("@" + HONDAJOJO_SCREEN_NAME);
} else if (mentions.length == 1 && mentions[0].key.getId() == HONDAJOJO_ID) { } else if (mentions.length == 1 && mentions[0].key.equals(HONDAJOJO_ID)) {
mentionedHondaJOJO = true; mentionedHondaJOJO = true;
} }
Utils.setLastSeen(this, mentions, System.currentTimeMillis()); Utils.setLastSeen(this, mentions, System.currentTimeMillis());
} }
if (!notReplyToOther) { if (!notReplyToOther) {
final long inReplyToUserId = resultStatus.getInReplyToUserId(); final String inReplyToUserId = resultStatus.getInReplyToUserId();
if (inReplyToUserId <= 0 || inReplyToUserId == HONDAJOJO_ID) { if (inReplyToUserId == null || HONDAJOJO_ID.check(inReplyToUserId, null)) {
notReplyToOther = true; notReplyToOther = true;
} }
} }
final ParcelableStatus result = ParcelableStatusUtils.fromStatus(resultStatus,
account.account_key, false);
if (shouldShorten && shortener != null && shortenedResult != null) { if (shouldShorten && shortener != null && shortenedResult != null) {
shortener.callback(shortenedResult, result); shortener.callback(shortenedResult, result);
} }

View File

@ -104,7 +104,7 @@ public class RefreshService extends Service implements Constants {
@Nullable @Nullable
@Override @Override
public long[] getSinceIds() { public String[] getSinceIds() {
return DataStoreUtils.getNewestStatusIds(context, return DataStoreUtils.getNewestStatusIds(context,
Statuses.CONTENT_URI, getAccountKeys()); Statuses.CONTENT_URI, getAccountKeys());
} }
@ -125,7 +125,7 @@ public class RefreshService extends Service implements Constants {
@Nullable @Nullable
@Override @Override
public long[] getSinceIds() { public String[] getSinceIds() {
return DataStoreUtils.getNewestActivityMaxPositions(context, return DataStoreUtils.getNewestActivityMaxPositions(context,
Activities.AboutMe.CONTENT_URI, getAccountKeys()); Activities.AboutMe.CONTENT_URI, getAccountKeys());
} }
@ -146,7 +146,7 @@ public class RefreshService extends Service implements Constants {
@Nullable @Nullable
@Override @Override
public long[] getSinceIds() { public String[] getSinceIds() {
return DataStoreUtils.getNewestMessageIds(context, return DataStoreUtils.getNewestMessageIds(context,
DirectMessages.Inbox.CONTENT_URI, getAccountKeys()); DirectMessages.Inbox.CONTENT_URI, getAccountKeys());
} }

View File

@ -13,6 +13,7 @@ import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import android.support.v4.util.SimpleArrayMap; import android.support.v4.util.SimpleArrayMap;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import org.mariotaku.restfu.http.Authorization; import org.mariotaku.restfu.http.Authorization;
@ -34,10 +35,10 @@ import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.api.twitter.model.User; import org.mariotaku.twidere.api.twitter.model.User;
import org.mariotaku.twidere.api.twitter.model.UserList; import org.mariotaku.twidere.api.twitter.model.UserList;
import org.mariotaku.twidere.api.twitter.model.Warning; import org.mariotaku.twidere.api.twitter.model.Warning;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.AccountPreferences; import org.mariotaku.twidere.model.AccountPreferences;
import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.provider.TwidereDataStore.AccountSupportColumns; import org.mariotaku.twidere.provider.TwidereDataStore.AccountSupportColumns;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities; import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
@ -240,21 +241,22 @@ public class StreamingService extends Service implements Constants {
@Override @Override
public void onDirectMessage(final DirectMessage directMessage) { public void onDirectMessage(final DirectMessage directMessage) {
if (directMessage == null || directMessage.getId() <= 0) return; if (directMessage == null || directMessage.getId() == null) return;
final String where = Expression.and(Expression.equalsArgs(DirectMessages.ACCOUNT_KEY),
Expression.equalsArgs(DirectMessages.MESSAGE_ID)).getSQL();
final String[] whereArgs = {account.account_key.toString(), directMessage.getId()};
for (final Uri uri : MESSAGES_URIS) { for (final Uri uri : MESSAGES_URIS) {
final String where = DirectMessages.ACCOUNT_KEY + " = " + account.account_key + " AND " resolver.delete(uri, where, whereArgs);
+ DirectMessages.MESSAGE_ID + " = " + directMessage.getId();
resolver.delete(uri, where, null);
} }
final User sender = directMessage.getSender(), recipient = directMessage.getRecipient(); final User sender = directMessage.getSender(), recipient = directMessage.getRecipient();
if (sender.getId() == account.account_key.getId()) { if (TextUtils.equals(sender.getId(), account.account_key.getId())) {
final ContentValues values = ContentValuesCreator.createDirectMessage(directMessage, final ContentValues values = ContentValuesCreator.createDirectMessage(directMessage,
account.account_key, true); account.account_key, true);
if (values != null) { if (values != null) {
resolver.insert(DirectMessages.Outbox.CONTENT_URI, values); resolver.insert(DirectMessages.Outbox.CONTENT_URI, values);
} }
} }
if (recipient.getId() == account.account_key.getId()) { if (TextUtils.equals(recipient.getId(), account.account_key.getId())) {
final ContentValues values = ContentValuesCreator.createDirectMessage(directMessage, final ContentValues values = ContentValuesCreator.createDirectMessage(directMessage,
account.account_key, false); account.account_key, false);
final Uri.Builder builder = DirectMessages.Inbox.CONTENT_URI.buildUpon(); final Uri.Builder builder = DirectMessages.Inbox.CONTENT_URI.buildUpon();

View File

@ -65,7 +65,7 @@ public class CacheUsersStatusesTask extends AbstractTask<TwitterListResponse<Sta
final Set<ContentValues> statusesValues = new HashSet<>(); final Set<ContentValues> statusesValues = new HashSet<>();
final Set<ContentValues> hashTagValues = new HashSet<>(); final Set<ContentValues> hashTagValues = new HashSet<>();
final UserKey accountKey = params.mAccountKey; final UserKey accountKey = params.accountKey;
statusesValues.add(ContentValuesCreator.createStatus(status, accountKey)); statusesValues.add(ContentValuesCreator.createStatus(status, accountKey));
final String text = InternalTwitterContentUtils.unescapeTwitterStatusText(status.getText()); final String text = InternalTwitterContentUtils.unescapeTwitterStatusText(status.getText());
for (final String hashtag : extractor.extractHashtags(text)) { for (final String hashtag : extractor.extractHashtags(text)) {

View File

@ -7,6 +7,7 @@ import android.util.Log;
import com.squareup.otto.Bus; import com.squareup.otto.Bus;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.twidere.BuildConfig; import org.mariotaku.twidere.BuildConfig;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.TwidereConstants; import org.mariotaku.twidere.TwidereConstants;
@ -16,8 +17,8 @@ import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.DirectMessage; import org.mariotaku.twidere.api.twitter.model.DirectMessage;
import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.model.Paging;
import org.mariotaku.twidere.api.twitter.model.ResponseList; import org.mariotaku.twidere.api.twitter.model.ResponseList;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.RefreshTaskParam; import org.mariotaku.twidere.model.RefreshTaskParam;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.message.GetMessagesTaskEvent; import org.mariotaku.twidere.model.message.GetMessagesTaskEvent;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ContentValuesCreator; import org.mariotaku.twidere.util.ContentValuesCreator;
@ -74,19 +75,25 @@ public abstract class GetDirectMessagesTask extends AbstractTask<RefreshTaskPara
try { try {
final Paging paging = new Paging(); final Paging paging = new Paging();
paging.setCount(loadItemLimit); paging.setCount(loadItemLimit);
String max_id = null, sinceId = null; String maxId = null, sinceId = null;
if (maxIds != null && maxIds[idx] > 0) { if (maxIds != null && maxIds[idx] != null) {
max_id = maxIds[idx]; maxId = maxIds[idx];
paging.setMaxId(max_id); paging.setMaxId(maxId);
} }
if (sinceIds != null && sinceIds[idx] > 0) { if (sinceIds != null && sinceIds[idx] != null) {
sinceId = sinceIds[idx]; sinceId = sinceIds[idx];
paging.setSinceId(sinceId - 1); long sinceIdLong = NumberUtils.toLong(sinceId, -1);
//TODO handle non-twitter case
if (sinceIdLong != -1) {
paging.sinceId(String.valueOf(sinceIdLong - 1));
} else {
paging.sinceId(sinceId);
}
} }
final List<DirectMessage> messages = new ArrayList<>(); final List<DirectMessage> messages = new ArrayList<>();
final boolean truncated = Utils.truncateMessages(getDirectMessages(twitter, paging), messages, final boolean truncated = Utils.truncateMessages(getDirectMessages(twitter, paging), messages,
sinceId); sinceId);
result.add(new TwitterWrapper.MessageListResponse(accountKey, max_id, sinceId, messages, result.add(new TwitterWrapper.MessageListResponse(accountKey, maxId, sinceId, messages,
truncated)); truncated));
storeMessages(accountKey, messages, isOutgoing(), true); storeMessages(accountKey, messages, isOutgoing(), true);
errorInfoStore.remove(ErrorInfoStore.KEY_DIRECT_MESSAGES, accountKey); errorInfoStore.remove(ErrorInfoStore.KEY_DIRECT_MESSAGES, accountKey);

View File

@ -6,6 +6,7 @@ import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v4.util.LongSparseArray; import android.support.v4.util.LongSparseArray;
import android.text.TextUtils;
import android.util.Pair; import android.util.Pair;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
@ -84,9 +85,9 @@ public class UpdateAccountInfoTask extends AbstractTask<Pair<UserKey, Parcelable
Tab tab = indices.newObject(tabsCursor); Tab tab = indices.newObject(tabsCursor);
TabArguments arguments = tab.getArguments(); TabArguments arguments = tab.getArguments();
if (arguments != null) { if (arguments != null) {
final long accountId = arguments.getAccountId(); final String accountId = arguments.getAccountId();
final UserKey[] keys = arguments.getAccountKeys(); final UserKey[] keys = arguments.getAccountKeys();
if (accountKey.getId() == accountId && keys == null) { if (TextUtils.equals(accountKey.getId(), accountId) && keys == null) {
arguments.setAccountKeys(new UserKey[]{accountKey}); arguments.setAccountKeys(new UserKey[]{accountKey});
values.put(tab.getId(), TabValuesCreator.create(tab)); values.put(tab.getId(), TabValuesCreator.create(tab));
} }

View File

@ -18,9 +18,9 @@ import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.Activity; import org.mariotaku.twidere.api.twitter.model.Activity;
import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.model.Paging;
import org.mariotaku.twidere.api.twitter.model.ResponseList; import org.mariotaku.twidere.api.twitter.model.ResponseList;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.ParcelableActivity; import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.RefreshTaskParam; import org.mariotaku.twidere.model.RefreshTaskParam;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.message.GetActivitiesTaskEvent; import org.mariotaku.twidere.model.message.GetActivitiesTaskEvent;
import org.mariotaku.twidere.model.util.ParcelableActivityUtils; import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities; import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
@ -64,8 +64,8 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
@Override @Override
public Object doLongOperation(RefreshTaskParam param) { public Object doLongOperation(RefreshTaskParam param) {
final UserKey[] accountIds = param.getAccountKeys(); final UserKey[] accountIds = param.getAccountKeys();
final long[] maxIds = param.getMaxIds(); final String[] maxIds = param.getMaxIds();
final long[] sinceIds = param.getSinceIds(); final String[] sinceIds = param.getSinceIds();
final ContentResolver cr = context.getContentResolver(); final ContentResolver cr = context.getContentResolver();
final int loadItemLimit = preferences.getInt(KEY_LOAD_ITEM_LIMIT); final int loadItemLimit = preferences.getInt(KEY_LOAD_ITEM_LIMIT);
boolean saveReadPosition = false; boolean saveReadPosition = false;
@ -77,12 +77,12 @@ public abstract class GetActivitiesTask extends AbstractTask<RefreshTaskParam, O
if (twitter == null) continue; if (twitter == null) continue;
final Paging paging = new Paging(); final Paging paging = new Paging();
paging.count(loadItemLimit); paging.count(loadItemLimit);
if (maxIds != null && maxIds[i] > 0) { if (maxIds != null && maxIds[i] != null) {
paging.maxId(maxIds[i]); paging.maxId(maxIds[i]);
} }
if (sinceIds != null && sinceIds[i] > 0) { if (sinceIds != null && sinceIds[i] != null) {
paging.sinceId(sinceIds[i]); paging.sinceId(sinceIds[i]);
if (maxIds == null || maxIds[i] <= 0) { if (maxIds == null || maxIds[i] == null) {
paging.setLatestResults(true); paging.setLatestResults(true);
saveReadPosition = true; saveReadPosition = true;
} }

View File

@ -12,6 +12,7 @@ import android.util.Log;
import com.squareup.otto.Bus; import com.squareup.otto.Bus;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.mariotaku.sqliteqb.library.Columns; import org.mariotaku.sqliteqb.library.Columns;
import org.mariotaku.sqliteqb.library.Expression; import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.sqliteqb.library.RawItemArray; import org.mariotaku.sqliteqb.library.RawItemArray;
@ -23,8 +24,8 @@ import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.Paging; import org.mariotaku.twidere.api.twitter.model.Paging;
import org.mariotaku.twidere.api.twitter.model.ResponseList; import org.mariotaku.twidere.api.twitter.model.ResponseList;
import org.mariotaku.twidere.api.twitter.model.Status; import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.RefreshTaskParam; import org.mariotaku.twidere.model.RefreshTaskParam;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.message.GetStatusesTaskEvent; import org.mariotaku.twidere.model.message.GetStatusesTaskEvent;
import org.mariotaku.twidere.provider.TwidereDataStore.AccountSupportColumns; import org.mariotaku.twidere.provider.TwidereDataStore.AccountSupportColumns;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses; import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
@ -80,7 +81,7 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
protected abstract Uri getContentUri(); protected abstract Uri getContentUri();
private void storeStatus(final UserKey accountKey, final List<Status> statuses, private void storeStatus(final UserKey accountKey, final List<Status> statuses,
final long sinceId, final long maxId, final boolean notify) { final String sinceId, final String maxId, final boolean notify) {
if (statuses == null || statuses.isEmpty() || accountKey == null) { if (statuses == null || statuses.isEmpty() || accountKey == null) {
return; return;
} }
@ -88,19 +89,19 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
final ContentResolver resolver = context.getContentResolver(); final ContentResolver resolver = context.getContentResolver();
final boolean noItemsBefore = DataStoreUtils.getStatusCount(context, uri, accountKey) <= 0; final boolean noItemsBefore = DataStoreUtils.getStatusCount(context, uri, accountKey) <= 0;
final ContentValues[] values = new ContentValues[statuses.size()]; final ContentValues[] values = new ContentValues[statuses.size()];
final long[] statusIds = new long[statuses.size()]; final String[] statusIds = new String[statuses.size()];
long minId = -1; String minId = null;
int minIdx = -1; int minIdx = -1;
boolean hasIntersection = false; boolean hasIntersection = false;
for (int i = 0, j = statuses.size(); i < j; i++) { for (int i = 0, j = statuses.size(); i < j; i++) {
final Status status = statuses.get(i); final Status status = statuses.get(i);
values[i] = ContentValuesCreator.createStatus(status, accountKey); values[i] = ContentValuesCreator.createStatus(status, accountKey);
values[i].put(Statuses.INSERTED_DATE, System.currentTimeMillis()); values[i].put(Statuses.INSERTED_DATE, System.currentTimeMillis());
final long id = status.getId(); final String id = status.getId();
if (sinceId > 0 && id <= sinceId) { if (sinceId != null && id <= sinceId) {
hasIntersection = true; hasIntersection = true;
} }
if (minId == -1 || id < minId) { if (minId == null || id < minId) {
minId = id; minId = id;
minIdx = i; minIdx = i;
} }
@ -133,7 +134,7 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
// Insert a gap. // Insert a gap.
final boolean deletedOldGap = rowsDeleted > 0 && ArrayUtils.contains(statusIds, maxId); final boolean deletedOldGap = rowsDeleted > 0 && ArrayUtils.contains(statusIds, maxId);
final boolean noRowsDeleted = rowsDeleted == 0; final boolean noRowsDeleted = rowsDeleted == 0;
final boolean insertGap = minId > 0 && (noRowsDeleted || deletedOldGap) && !noItemsBefore final boolean insertGap = minId != null && (noRowsDeleted || deletedOldGap) && !noItemsBefore
&& !hasIntersection; && !hasIntersection;
if (insertGap && minIdx != -1) { if (insertGap && minIdx != -1) {
values[minIdx].put(Statuses.IS_GAP, true); values[minIdx].put(Statuses.IS_GAP, true);
@ -161,8 +162,8 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
@Override @Override
public List<TwitterWrapper.StatusListResponse> doLongOperation(final RefreshTaskParam param) { public List<TwitterWrapper.StatusListResponse> doLongOperation(final RefreshTaskParam param) {
final UserKey[] accountKeys = param.getAccountKeys(); final UserKey[] accountKeys = param.getAccountKeys();
final long[] maxIds = param.getMaxIds(); final String[] maxIds = param.getMaxIds();
final long[] sinceIds = param.getSinceIds(); final String[] sinceIds = param.getSinceIds();
final List<TwitterWrapper.StatusListResponse> result = new ArrayList<>(); final List<TwitterWrapper.StatusListResponse> result = new ArrayList<>();
int idx = 0; int idx = 0;
final int loadItemLimit = preferences.getInt(KEY_LOAD_ITEM_LIMIT, DEFAULT_LOAD_ITEM_LIMIT); final int loadItemLimit = preferences.getInt(KEY_LOAD_ITEM_LIMIT, DEFAULT_LOAD_ITEM_LIMIT);
@ -172,21 +173,27 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
try { try {
final Paging paging = new Paging(); final Paging paging = new Paging();
paging.count(loadItemLimit); paging.count(loadItemLimit);
final long maxId, sinceId; final String maxId, sinceId;
if (maxIds != null && maxIds[idx] > 0) { if (maxIds != null && maxIds[idx] != null) {
maxId = maxIds[idx]; maxId = maxIds[idx];
paging.maxId(maxId); paging.maxId(maxId);
} else { } else {
maxId = -1; maxId = null;
} }
if (sinceIds != null && sinceIds[idx] > 0) { if (sinceIds != null && sinceIds[idx] != null) {
sinceId = sinceIds[idx]; sinceId = sinceIds[idx];
paging.sinceId(sinceId - 1); long sinceIdLong = NumberUtils.toLong(sinceId, -1);
if (maxIds == null || sinceIds[idx] <= 0) { //TODO handle non-twitter case
if (sinceIdLong != -1) {
paging.sinceId(String.valueOf(sinceIdLong - 1));
} else {
paging.sinceId(sinceId);
}
if (maxIds == null || sinceIds[idx] == null) {
paging.setLatestResults(true); paging.setLatestResults(true);
} }
} else { } else {
sinceId = -1; sinceId = null;
} }
final List<Status> statuses = getStatuses(twitter, paging); final List<Status> statuses = getStatuses(twitter, paging);
InternalTwitterContentUtils.getStatusesWithQuoteData(twitter, statuses); InternalTwitterContentUtils.getStatusesWithQuoteData(twitter, statuses);

View File

@ -231,7 +231,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
return mAsyncTaskManager.add(task, true); return mAsyncTaskManager.add(task, true);
} }
public int destroyDirectMessageAsync(final UserKey accountKey, final long messageId) { public int destroyDirectMessageAsync(final UserKey accountKey, final String messageId) {
final DestroyDirectMessageTask task = new DestroyDirectMessageTask(accountKey, messageId); final DestroyDirectMessageTask task = new DestroyDirectMessageTask(accountKey, messageId);
return mAsyncTaskManager.add(task, true); return mAsyncTaskManager.add(task, true);
} }
@ -396,7 +396,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
@Nullable @Nullable
@Override @Override
public long[] getSinceIds() { public String[] getSinceIds() {
return DataStoreUtils.getNewestStatusIds(mContext, Statuses.CONTENT_URI, return DataStoreUtils.getNewestStatusIds(mContext, Statuses.CONTENT_URI,
getAccountKeys()); getAccountKeys());
} }
@ -410,7 +410,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
@Nullable @Nullable
@Override @Override
public long[] getSinceIds() { public String[] getSinceIds() {
return DataStoreUtils.getNewestActivityMaxPositions(mContext, return DataStoreUtils.getNewestActivityMaxPositions(mContext,
Activities.AboutMe.CONTENT_URI, getAccountKeys()); Activities.AboutMe.CONTENT_URI, getAccountKeys());
} }
@ -440,7 +440,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
} }
} }
public void removeUnreadCountsAsync(final int position, final SimpleArrayMap<UserKey, Set<Long>> counts) { public void removeUnreadCountsAsync(final int position, final SimpleArrayMap<UserKey, Set<String>> counts) {
final RemoveUnreadCountsTask task = new RemoveUnreadCountsTask(position, counts); final RemoveUnreadCountsTask task = new RemoveUnreadCountsTask(position, counts);
AsyncTaskUtils.executeTask(task); AsyncTaskUtils.executeTask(task);
} }
@ -459,7 +459,7 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
return mAsyncTaskManager.add(task, true); return mAsyncTaskManager.add(task, true);
} }
public int sendDirectMessageAsync(final UserKey accountKey, final long recipientId, final String text, public int sendDirectMessageAsync(final UserKey accountKey, final String recipientId, final String text,
final String imageUri) { final String imageUri) {
final Intent intent = new Intent(mContext, BackgroundOperationService.class); final Intent intent = new Intent(mContext, BackgroundOperationService.class);
intent.setAction(INTENT_ACTION_SEND_DIRECT_MESSAGE); intent.setAction(INTENT_ACTION_SEND_DIRECT_MESSAGE);
@ -1404,18 +1404,20 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
class DestroyDirectMessageTask extends ManagedAsyncTask<Object, Object, SingleResponse<DirectMessage>> { class DestroyDirectMessageTask extends ManagedAsyncTask<Object, Object, SingleResponse<DirectMessage>> {
private final UserKey mAccountKey; private final UserKey mAccountKey;
private final long mMessageId; private final String mMessageId;
public DestroyDirectMessageTask(final UserKey accountKey, final long messageId) { public DestroyDirectMessageTask(final UserKey accountKey, final String messageId) {
super(mContext); super(mContext);
mAccountKey = accountKey; mAccountKey = accountKey;
mMessageId = messageId; mMessageId = messageId;
} }
private void deleteMessages(final long message_id) { private void deleteMessages() {
final String where = DirectMessages.MESSAGE_ID + " = " + message_id; final String where = Expression.and(Expression.equalsArgs(DirectMessages.ACCOUNT_KEY),
mResolver.delete(DirectMessages.Inbox.CONTENT_URI, where, null); Expression.equalsArgs(DirectMessages.MESSAGE_ID)).getSQL();
mResolver.delete(DirectMessages.Outbox.CONTENT_URI, where, null); final String[] whereArgs = new String[]{mAccountKey.toString(), mMessageId};
mResolver.delete(DirectMessages.Inbox.CONTENT_URI, where, whereArgs);
mResolver.delete(DirectMessages.Outbox.CONTENT_URI, where, whereArgs);
} }
private boolean isMessageNotFound(final Exception e) { private boolean isMessageNotFound(final Exception e) {
@ -1431,11 +1433,11 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
if (twitter == null) return SingleResponse.getInstance(); if (twitter == null) return SingleResponse.getInstance();
try { try {
final DirectMessage message = twitter.destroyDirectMessage(mMessageId); final DirectMessage message = twitter.destroyDirectMessage(mMessageId);
deleteMessages(mMessageId); deleteMessages();
return SingleResponse.getInstance(message, null); return SingleResponse.getInstance(message, null);
} catch (final TwitterException e) { } catch (final TwitterException e) {
if (isMessageNotFound(e)) { if (isMessageNotFound(e)) {
deleteMessages(mMessageId); deleteMessages();
} }
return SingleResponse.getInstance(null, e); return SingleResponse.getInstance(null, e);
} }
@ -1939,9 +1941,9 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
final class RemoveUnreadCountsTask extends AsyncTask<Object, Object, Integer> { final class RemoveUnreadCountsTask extends AsyncTask<Object, Object, Integer> {
private final int position; private final int position;
private final SimpleArrayMap<UserKey, Set<Long>> counts; private final SimpleArrayMap<UserKey, Set<String>> counts;
RemoveUnreadCountsTask(final int position, final SimpleArrayMap<UserKey, Set<Long>> counts) { RemoveUnreadCountsTask(final int position, final SimpleArrayMap<UserKey, Set<String>> counts) {
this.position = position; this.position = position;
this.counts = counts; this.counts = counts;
} }

View File

@ -30,7 +30,6 @@ import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.api.twitter.model.Trend; import org.mariotaku.twidere.api.twitter.model.Trend;
import org.mariotaku.twidere.api.twitter.model.Trends; import org.mariotaku.twidere.api.twitter.model.Trends;
import org.mariotaku.twidere.api.twitter.model.User; import org.mariotaku.twidere.api.twitter.model.User;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.Draft; import org.mariotaku.twidere.model.Draft;
import org.mariotaku.twidere.model.ParcelableActivity; import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableActivityValuesCreator; import org.mariotaku.twidere.model.ParcelableActivityValuesCreator;
@ -43,6 +42,7 @@ import org.mariotaku.twidere.model.ParcelableStatusValuesCreator;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.ParcelableUserMention; import org.mariotaku.twidere.model.ParcelableUserMention;
import org.mariotaku.twidere.model.ParcelableUserValuesCreator; import org.mariotaku.twidere.model.ParcelableUserValuesCreator;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.draft.SendDirectMessageActionExtra; import org.mariotaku.twidere.model.draft.SendDirectMessageActionExtra;
import org.mariotaku.twidere.model.util.ParcelableActivityUtils; import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
import org.mariotaku.twidere.model.util.ParcelableMediaUtils; import org.mariotaku.twidere.model.util.ParcelableMediaUtils;
@ -155,13 +155,12 @@ public final class ContentValuesCreator implements TwidereConstants {
return values; return values;
} }
public static ContentValues createMessageDraft(final UserKey accountKey, final long recipientId, public static ContentValues createMessageDraft(final UserKey accountKey, final String recipientId,
final String text, final String imageUri) { final String text, final String imageUri) {
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(Drafts.ACTION_TYPE, Draft.Action.SEND_DIRECT_MESSAGE); values.put(Drafts.ACTION_TYPE, Draft.Action.SEND_DIRECT_MESSAGE);
values.put(Drafts.TEXT, text); values.put(Drafts.TEXT, text);
values.put(Drafts.ACCOUNT_IDS, TwidereArrayUtils.toString(new long[]{accountKey.getId()}, values.put(Drafts.ACCOUNT_IDS, accountKey.toString());
',', false));
values.put(Drafts.TIMESTAMP, System.currentTimeMillis()); values.put(Drafts.TIMESTAMP, System.currentTimeMillis());
if (imageUri != null) { if (imageUri != null) {
final ParcelableMediaUpdate[] mediaArray = {new ParcelableMediaUpdate(imageUri, 0)}; final ParcelableMediaUpdate[] mediaArray = {new ParcelableMediaUpdate(imageUri, 0)};
@ -244,32 +243,4 @@ public final class ContentValuesCreator implements TwidereConstants {
return resultList.toArray(new ContentValues[resultList.size()]); return resultList.toArray(new ContentValues[resultList.size()]);
} }
public static ContentValues makeCachedUserContentValues(final ParcelableUser user) {
if (user == null) return null;
final ContentValues values = new ContentValues();
values.put(CachedUsers.USER_KEY, String.valueOf(user.key));
values.put(CachedUsers.NAME, user.name);
values.put(CachedUsers.SCREEN_NAME, user.screen_name);
values.put(CachedUsers.PROFILE_IMAGE_URL, user.profile_image_url);
values.put(CachedUsers.CREATED_AT, user.created_at);
values.put(CachedUsers.IS_PROTECTED, user.is_protected);
values.put(CachedUsers.IS_VERIFIED, user.is_verified);
values.put(CachedUsers.LISTED_COUNT, user.listed_count);
values.put(CachedUsers.FAVORITES_COUNT, user.favorites_count);
values.put(CachedUsers.FOLLOWERS_COUNT, user.followers_count);
values.put(CachedUsers.FRIENDS_COUNT, user.friends_count);
values.put(CachedUsers.STATUSES_COUNT, user.statuses_count);
values.put(CachedUsers.LOCATION, user.location);
values.put(CachedUsers.DESCRIPTION_PLAIN, user.description_plain);
values.put(CachedUsers.DESCRIPTION_HTML, user.description_html);
values.put(CachedUsers.DESCRIPTION_EXPANDED, user.description_expanded);
values.put(CachedUsers.URL, user.url);
values.put(CachedUsers.URL_EXPANDED, user.url_expanded);
values.put(CachedUsers.PROFILE_BANNER_URL, user.profile_banner_url);
values.put(CachedUsers.IS_FOLLOWING, user.is_following);
values.put(CachedUsers.BACKGROUND_COLOR, user.background_color);
values.put(CachedUsers.LINK_COLOR, user.link_color);
values.put(CachedUsers.TEXT_COLOR, user.text_color);
return values;
}
} }

View File

@ -242,14 +242,14 @@ public class IntentUtils implements Constants {
public static void openMessageConversation(@NonNull final Context context, public static void openMessageConversation(@NonNull final Context context,
@Nullable final UserKey accountKey, @Nullable final UserKey accountKey,
final long recipientId) { final String recipientId) {
final Uri.Builder builder = new Uri.Builder(); final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE); builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_DIRECT_MESSAGES_CONVERSATION); builder.authority(AUTHORITY_DIRECT_MESSAGES_CONVERSATION);
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()); builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString());
if (recipientId > 0) { if (recipientId != null) {
builder.appendQueryParameter(QUERY_PARAM_RECIPIENT_ID, String.valueOf(recipientId)); builder.appendQueryParameter(QUERY_PARAM_RECIPIENT_ID, recipientId);
} }
} }
final Intent intent = new Intent(Intent.ACTION_VIEW, builder.build()); final Intent intent = new Intent(Intent.ACTION_VIEW, builder.build());
@ -428,15 +428,15 @@ public class IntentUtils implements Constants {
public static void openUserFavorites(@NonNull final Context context, public static void openUserFavorites(@NonNull final Context context,
@Nullable final UserKey accountKey, @Nullable final UserKey accountKey,
final long userId, final String screenName) { final String userId, final String screenName) {
final Uri.Builder builder = new Uri.Builder(); final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE); builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_FAVORITES); builder.authority(AUTHORITY_USER_FAVORITES);
if (accountKey != null) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString()); builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString());
} }
if (userId > 0) { if (userId != null) {
builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(userId)); builder.appendQueryParameter(QUERY_PARAM_USER_ID, userId);
} }
if (screenName != null) { if (screenName != null) {
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName); builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName);
@ -487,7 +487,7 @@ public class IntentUtils implements Constants {
public static void openUserListDetails(@NonNull final Context context, public static void openUserListDetails(@NonNull final Context context,
@Nullable final UserKey accountKey, final long listId, @Nullable final UserKey accountKey, final long listId,
final long userId, final String screenName, final String listName) { final String userId, final String screenName, final String listName) {
final Uri.Builder builder = new Uri.Builder(); final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE); builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_LIST); builder.authority(AUTHORITY_USER_LIST);
@ -497,8 +497,8 @@ public class IntentUtils implements Constants {
if (listId > 0) { if (listId > 0) {
builder.appendQueryParameter(QUERY_PARAM_LIST_ID, String.valueOf(listId)); builder.appendQueryParameter(QUERY_PARAM_LIST_ID, String.valueOf(listId));
} }
if (userId > 0) { if (userId != null) {
builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(userId)); builder.appendQueryParameter(QUERY_PARAM_USER_ID, userId);
} }
if (screenName != null) { if (screenName != null) {
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName); builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, screenName);

View File

@ -170,7 +170,7 @@ public class KeyboardShortcutsHandler implements Constants, KeyboardShortcutCons
return true; return true;
} }
case ACTION_MESSAGE: { case ACTION_MESSAGE: {
IntentUtils.openMessageConversation(context, null, -1); IntentUtils.openMessageConversation(context, null, null);
return true; return true;
} }
} }

View File

@ -35,13 +35,13 @@ public class LinkCreator implements Constants {
private static final String AUTHORITY_TWITTER = "twitter.com"; private static final String AUTHORITY_TWITTER = "twitter.com";
public static Uri getTwitterStatusLink(String screenName, long statusId) { public static Uri getTwitterStatusLink(String screenName, String statusId) {
Uri.Builder builder = new Uri.Builder(); Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_HTTPS); builder.scheme(SCHEME_HTTPS);
builder.authority(AUTHORITY_TWITTER); builder.authority(AUTHORITY_TWITTER);
builder.appendPath(screenName); builder.appendPath(screenName);
builder.appendPath("status"); builder.appendPath("status");
builder.appendPath(String.valueOf(statusId)); builder.appendPath(statusId);
return builder.build(); return builder.build();
} }

View File

@ -26,11 +26,11 @@ import android.net.Uri;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.StringUtils;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.fragment.support.UserFragment; import org.mariotaku.twidere.fragment.support.UserFragment;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.UserKey;
import org.mariotaku.twidere.model.util.ParcelableMediaUtils; import org.mariotaku.twidere.model.util.ParcelableMediaUtils;
import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener; import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener;
import org.mariotaku.twidere.util.media.preview.PreviewMediaExtractor; import org.mariotaku.twidere.util.media.preview.PreviewMediaExtractor;
@ -64,7 +64,7 @@ public class OnLinkClickHandler implements OnLinkClickListener, Constants {
switch (type) { switch (type) {
case TwidereLinkify.LINK_TYPE_MENTION: { case TwidereLinkify.LINK_TYPE_MENTION: {
IntentUtils.openUserProfile(context, accountKey, -1, link, null, true, IntentUtils.openUserProfile(context, accountKey, null, link, null, true,
UserFragment.Referral.USER_MENTION); UserFragment.Referral.USER_MENTION);
break; break;
} }
@ -81,11 +81,12 @@ public class OnLinkClickHandler implements OnLinkClickListener, Constants {
break; break;
} }
case TwidereLinkify.LINK_TYPE_LIST: { case TwidereLinkify.LINK_TYPE_LIST: {
final String[] mentionList = link.split("/"); final String[] mentionList = StringUtils.split(link, "/");
if (mentionList.length != 2) { if (mentionList.length != 2) {
break; break;
} }
IntentUtils.openUserListDetails(context, accountKey, -1, -1, mentionList[0], mentionList[1]); IntentUtils.openUserListDetails(context, accountKey, -1, null, mentionList[0],
mentionList[1]);
break; break;
} }
case TwidereLinkify.LINK_TYPE_CASHTAG: { case TwidereLinkify.LINK_TYPE_CASHTAG: {
@ -93,12 +94,12 @@ public class OnLinkClickHandler implements OnLinkClickListener, Constants {
break; break;
} }
case TwidereLinkify.LINK_TYPE_USER_ID: { case TwidereLinkify.LINK_TYPE_USER_ID: {
IntentUtils.openUserProfile(context, accountKey, NumberUtils.toLong(link, -1), null, IntentUtils.openUserProfile(context, accountKey, link, null, null, true,
null, true, UserFragment.Referral.USER_MENTION); UserFragment.Referral.USER_MENTION);
break; break;
} }
case TwidereLinkify.LINK_TYPE_STATUS: { case TwidereLinkify.LINK_TYPE_STATUS: {
IntentUtils.openStatus(context, accountKey, NumberUtils.toLong(link, -1)); IntentUtils.openStatus(context, accountKey, link);
break; break;
} }
} }

View File

@ -45,7 +45,6 @@ import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.InputStream; import java.io.InputStream;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Set; import java.util.Set;
public class TwitterWrapper implements Constants { public class TwitterWrapper implements Constants {
@ -91,12 +90,12 @@ public class TwitterWrapper implements Constants {
} }
public static int removeUnreadCounts(final Context context, final int position, public static int removeUnreadCounts(final Context context, final int position,
final SimpleArrayMap<UserKey, Set<Long>> counts) { final SimpleArrayMap<UserKey, Set<String>> counts) {
if (context == null || position < 0 || counts == null) return 0; if (context == null || position < 0 || counts == null) return 0;
int result = 0; int result = 0;
for (int i = 0, j = counts.size(); i < j; i++) { for (int i = 0, j = counts.size(); i < j; i++) {
final UserKey key = counts.keyAt(i); final UserKey key = counts.keyAt(i);
final Set<Long> value = counts.valueAt(i); final Set<String> value = counts.valueAt(i);
final Uri.Builder builder = UnreadCounts.CONTENT_URI.buildUpon(); final Uri.Builder builder = UnreadCounts.CONTENT_URI.buildUpon();
builder.appendPath(String.valueOf(position)); builder.appendPath(String.valueOf(position));
builder.appendPath(String.valueOf(key)); builder.appendPath(String.valueOf(key));
@ -204,19 +203,19 @@ public class TwitterWrapper implements Constants {
public final boolean truncated; public final boolean truncated;
public MessageListResponse(final UserKey accountKey, final Exception exception) { public MessageListResponse(final UserKey accountKey, final Exception exception) {
this(accountKey, -1, -1, null, false, exception); this(accountKey, null, null, null, false, exception);
} }
public MessageListResponse(final UserKey accountKey, final List<DirectMessage> list) { public MessageListResponse(final UserKey accountKey, final List<DirectMessage> list) {
this(accountKey, -1, -1, list, false, null); this(accountKey, null, null, list, false, null);
} }
public MessageListResponse(final UserKey accountKey, final long maxId, final long sinceId, public MessageListResponse(final UserKey accountKey, final String maxId, final String sinceId,
final List<DirectMessage> list, final boolean truncated) { final List<DirectMessage> list, final boolean truncated) {
this(accountKey, maxId, sinceId, list, truncated, null); this(accountKey, maxId, sinceId, list, truncated, null);
} }
MessageListResponse(final UserKey accountKey, final long maxId, final long sinceId, MessageListResponse(final UserKey accountKey, final String maxId, final String sinceId,
final List<DirectMessage> list, final boolean truncated, final Exception exception) { final List<DirectMessage> list, final boolean truncated, final Exception exception) {
super(accountKey, maxId, sinceId, list, exception); super(accountKey, maxId, sinceId, list, exception);
this.truncated = truncated; this.truncated = truncated;
@ -229,19 +228,19 @@ public class TwitterWrapper implements Constants {
public final boolean truncated; public final boolean truncated;
public StatusListResponse(final UserKey accountKey, final Exception exception) { public StatusListResponse(final UserKey accountKey, final Exception exception) {
this(accountKey, -1, -1, null, false, exception); this(accountKey, null, null, null, false, exception);
} }
public StatusListResponse(final UserKey accountKey, final List<Status> list) { public StatusListResponse(final UserKey accountKey, final List<Status> list) {
this(accountKey, -1, -1, list, false, null); this(accountKey, null, null, list, false, null);
} }
public StatusListResponse(final UserKey accountKey, final long maxId, final long sinceId, public StatusListResponse(final UserKey accountKey, final String maxId, final String sinceId,
final List<Status> list, final boolean truncated) { final List<Status> list, final boolean truncated) {
this(accountKey, maxId, sinceId, list, truncated, null); this(accountKey, maxId, sinceId, list, truncated, null);
} }
StatusListResponse(final UserKey accountKey, final long maxId, final long sinceId, final List<Status> list, StatusListResponse(final UserKey accountKey, final String maxId, final String sinceId, final List<Status> list,
final boolean truncated, final Exception exception) { final boolean truncated, final Exception exception) {
super(accountKey, maxId, sinceId, list, exception); super(accountKey, maxId, sinceId, list, exception);
this.truncated = truncated; this.truncated = truncated;
@ -251,24 +250,24 @@ public class TwitterWrapper implements Constants {
public static class TwitterListResponse<Data> extends ListResponse<Data> { public static class TwitterListResponse<Data> extends ListResponse<Data> {
public final UserKey mAccountKey; public final UserKey accountKey;
public final long maxId; public final String maxId;
public final long sinceId; public final String sinceId;
public TwitterListResponse(final UserKey accountKey, public TwitterListResponse(final UserKey accountKey,
final Exception exception) { final Exception exception) {
this(accountKey, -1, -1, null, exception); this(accountKey, null, null, null, exception);
} }
public TwitterListResponse(final UserKey accountKey, final long maxId, public TwitterListResponse(final UserKey accountKey, final String maxId,
final long sinceId, final List<Data> list) { final String sinceId, final List<Data> list) {
this(accountKey, maxId, sinceId, list, null); this(accountKey, maxId, sinceId, list, null);
} }
TwitterListResponse(final UserKey accountKey, final long maxId, TwitterListResponse(final UserKey accountKey, final String maxId, final String sinceId,
final long sinceId, final List<Data> list, final Exception exception) { final List<Data> list, final Exception exception) {
super(list, exception); super(list, exception);
this.mAccountKey = accountKey; this.accountKey = accountKey;
this.maxId = maxId; this.maxId = maxId;
this.sinceId = sinceId; this.sinceId = sinceId;
} }

View File

@ -1384,15 +1384,15 @@ public final class Utils implements Constants {
return VALUE_MEDIA_PREVIEW_STYLE_CODE_CROP; return VALUE_MEDIA_PREVIEW_STYLE_CODE_CROP;
} }
public static String getQuoteStatus(final Context context, long statusId, final String screen_name, final String text) { public static String getQuoteStatus(final Context context, String statusId, final String screenName, final String text) {
if (context == null) return null; if (context == null) return null;
String quoteFormat = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE).getString( String quoteFormat = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE).getString(
KEY_QUOTE_FORMAT, DEFAULT_QUOTE_FORMAT); KEY_QUOTE_FORMAT, DEFAULT_QUOTE_FORMAT);
if (isEmpty(quoteFormat)) { if (isEmpty(quoteFormat)) {
quoteFormat = DEFAULT_QUOTE_FORMAT; quoteFormat = DEFAULT_QUOTE_FORMAT;
} }
String result = quoteFormat.replace(FORMAT_PATTERN_LINK, LinkCreator.getTwitterStatusLink(screen_name, statusId).toString()); String result = quoteFormat.replace(FORMAT_PATTERN_LINK, LinkCreator.getTwitterStatusLink(screenName, statusId).toString());
result = result.replace(FORMAT_PATTERN_NAME, screen_name); result = result.replace(FORMAT_PATTERN_NAME, screenName);
result = result.replace(FORMAT_PATTERN_TEXT, text); result = result.replace(FORMAT_PATTERN_TEXT, text);
return result; return result;
} }
@ -2001,10 +2001,10 @@ public final class Utils implements Constants {
} }
public static boolean truncateMessages(final List<DirectMessage> in, final List<DirectMessage> out, public static boolean truncateMessages(final List<DirectMessage> in, final List<DirectMessage> out,
final long sinceId) { final String sinceId) {
if (in == null) return false; if (in == null) return false;
for (final DirectMessage message : in) { for (final DirectMessage message : in) {
if (sinceId > 0 && message.getId() <= sinceId) { if (sinceId != null && message.getId() <= sinceId) {
continue; continue;
} }
out.add(message); out.add(message);
@ -2013,10 +2013,10 @@ public final class Utils implements Constants {
} }
public static boolean truncateStatuses(final List<Status> in, final List<Status> out, public static boolean truncateStatuses(final List<Status> in, final List<Status> out,
final long sinceId) { final String sinceId) {
if (in == null) return false; if (in == null) return false;
for (final Status status : in) { for (final Status status : in) {
if (sinceId > 0 && status.getId() <= sinceId) { if (sinceId != null && status.getId() <= sinceId) {
continue; continue;
} }
out.add(status); out.add(status);
@ -2100,11 +2100,11 @@ public final class Utils implements Constants {
@Nullable @Nullable
public static ParcelableUser getUserForConversation(@NonNull final Context context, public static ParcelableUser getUserForConversation(@NonNull final Context context,
@NonNull final UserKey accountKey, @NonNull final UserKey accountKey,
final long conversationId) { final String conversationId) {
final ContentResolver cr = context.getContentResolver(); final ContentResolver cr = context.getContentResolver();
final Expression where = Expression.and(Expression.equalsArgs(ConversationEntries.ACCOUNT_KEY), final Expression where = Expression.and(Expression.equalsArgs(ConversationEntries.ACCOUNT_KEY),
Expression.equalsArgs(ConversationEntries.CONVERSATION_ID)); Expression.equalsArgs(ConversationEntries.CONVERSATION_ID));
final String[] whereArgs = {accountKey.toString(), String.valueOf(conversationId)}; final String[] whereArgs = {accountKey.toString(), conversationId};
final Cursor c = cr.query(ConversationEntries.CONTENT_URI, null, where.getSQL(), whereArgs, final Cursor c = cr.query(ConversationEntries.CONTENT_URI, null, where.getSQL(), whereArgs,
null); null);
if (c == null) return null; if (c == null) return null;

View File

@ -76,7 +76,7 @@ public class GroupViewHolder extends ViewHolder implements View.OnClickListener,
nameView.setScreenName("!" + group.nickname); nameView.setScreenName("!" + group.nickname);
nameView.updateText(formatter); nameView.updateText(formatter);
final String groupHost = UserKeyUtils.getUserHost(group.url); final String groupHost = UserKeyUtils.getUserHost(group.url, group.account_key.getHost());
if (UserKeyUtils.isSameHost(group.account_key.getHost(), groupHost)) { if (UserKeyUtils.isSameHost(group.account_key.getHost(), groupHost)) {
externalIndicator.setVisibility(View.GONE); externalIndicator.setVisibility(View.GONE);
} else { } else {

View File

@ -221,7 +221,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, IStatusVi
if (statusContentUpperSpace != null) { if (statusContentUpperSpace != null) {
statusContentUpperSpace.setVisibility(View.GONE); statusContentUpperSpace.setVisibility(View.GONE);
} }
} else if (status.retweet_id > 0) { } else if (status.retweet_id != null) {
final String retweetedBy = manager.getDisplayName(status.retweeted_by_user_id, final String retweetedBy = manager.getDisplayName(status.retweeted_by_user_id,
status.retweeted_by_user_name, status.retweeted_by_user_screen_name, nameFirst, false); status.retweeted_by_user_name, status.retweeted_by_user_screen_name, nameFirst, false);
statusInfoLabel.setText(context.getString(R.string.name_retweeted, formatter.unicodeWrap(retweetedBy))); statusInfoLabel.setText(context.getString(R.string.name_retweeted, formatter.unicodeWrap(retweetedBy)));
@ -232,7 +232,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, IStatusVi
if (statusContentUpperSpace != null) { if (statusContentUpperSpace != null) {
statusContentUpperSpace.setVisibility(View.GONE); statusContentUpperSpace.setVisibility(View.GONE);
} }
} else if (status.in_reply_to_status_id > 0 && status.in_reply_to_user_id != null && displayInReplyTo) { } else if (status.in_reply_to_status_id != null && status.in_reply_to_user_id != null && displayInReplyTo) {
final String inReplyTo = manager.getDisplayName(status.in_reply_to_user_id, final String inReplyTo = manager.getDisplayName(status.in_reply_to_user_id,
status.in_reply_to_name, status.in_reply_to_screen_name, nameFirst, false); status.in_reply_to_name, status.in_reply_to_screen_name, nameFirst, false);
statusInfoLabel.setText(context.getString(R.string.in_reply_to_name, formatter.unicodeWrap(inReplyTo))); statusInfoLabel.setText(context.getString(R.string.in_reply_to_name, formatter.unicodeWrap(inReplyTo)));