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

migrating account

This commit is contained in:
Mariotaku Lee 2016-03-07 09:00:28 +08:00
parent 305ff7cbd3
commit 1a2914f86e
58 changed files with 399 additions and 263 deletions

View File

@ -38,11 +38,11 @@ android {
dependencies { dependencies {
apt 'com.bluelinelabs:logansquare-compiler:1.3.4' apt 'com.bluelinelabs:logansquare-compiler:1.3.4'
apt 'com.hannesdorfmann.parcelableplease:processor:1.0.2' apt 'com.hannesdorfmann.parcelableplease:processor:1.0.2'
apt 'com.github.mariotaku.ObjectCursor:processor:0.9.6-SNAPSHOT' apt 'com.github.mariotaku.ObjectCursor:processor:0.9.6'
compile 'com.android.support:support-annotations:23.2.0' compile 'com.android.support:support-annotations:23.2.0'
compile 'com.bluelinelabs:logansquare:1.3.4' compile 'com.bluelinelabs:logansquare:1.3.4'
compile 'com.github.mariotaku.RestFu:library:0.9.24' compile 'com.github.mariotaku.RestFu:library:0.9.24'
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.2' compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.2'
compile 'com.github.mariotaku.ObjectCursor:core:0.9.6-SNAPSHOT' compile 'com.github.mariotaku.ObjectCursor:core:0.9.6'
compile fileTree(dir: 'libs', include: ['*.jar']) compile fileTree(dir: 'libs', include: ['*.jar'])
} }

View File

@ -78,7 +78,7 @@ dependencies {
androidTestApt 'com.bluelinelabs:logansquare-compiler:1.3.4' androidTestApt 'com.bluelinelabs:logansquare-compiler:1.3.4'
apt 'com.hannesdorfmann.parcelableplease:processor:1.0.2' apt 'com.hannesdorfmann.parcelableplease:processor:1.0.2'
apt 'com.google.dagger:dagger-compiler:2.0.2' apt 'com.google.dagger:dagger-compiler:2.0.2'
apt "com.github.mariotaku.ObjectCursor:processor:0.9.6-SNAPSHOT" apt "com.github.mariotaku.ObjectCursor:processor:0.9.6"
compile 'com.android.support:multidex:1.0.1' compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:support-v13:23.2.0' compile 'com.android.support:support-v13:23.2.0'
@ -117,7 +117,7 @@ dependencies {
compile 'com.github.mariotaku.MediaViewerLibrary:base:0.9.12' compile 'com.github.mariotaku.MediaViewerLibrary:base:0.9.12'
compile 'com.github.mariotaku.MediaViewerLibrary:subsample-image-view:0.9.12' compile 'com.github.mariotaku.MediaViewerLibrary:subsample-image-view:0.9.12'
compile 'com.github.mariotaku.SQLiteQB:library:0.9.5' compile 'com.github.mariotaku.SQLiteQB:library:0.9.5'
compile 'com.github.mariotaku.ObjectCursor:core:0.9.6-SNAPSHOT' compile 'com.github.mariotaku.ObjectCursor:core:0.9.6'
compile project(':twidere.component.common') compile project(':twidere.component.common')
compile project(':twidere.component.nyan') compile project(':twidere.component.nyan')

View File

@ -47,6 +47,9 @@ public class TweetEvent extends BaseEvent implements Parcelable {
@JsonField(name = "account_id") @JsonField(name = "account_id")
long accountId; long accountId;
@ParcelableThisPlease @ParcelableThisPlease
@JsonField(name = "account_host")
String accountHost;
@ParcelableThisPlease
@JsonField(name = "user_id") @JsonField(name = "user_id")
long userId; long userId;
@ParcelableThisPlease @ParcelableThisPlease
@ -81,6 +84,7 @@ public class TweetEvent extends BaseEvent implements Parcelable {
event.markStart(context); event.markStart(context);
event.setId(status.id); event.setId(status.id);
event.setAccountId(status.account_id); event.setAccountId(status.account_id);
event.setAccountHost(status.account_host);
event.setUserId(status.user_id); event.setUserId(status.user_id);
event.setTimelineType(timelineType); event.setTimelineType(timelineType);
event.setTweetType(TwidereDataUtils.getTweetType(status)); event.setTweetType(TwidereDataUtils.getTweetType(status));
@ -116,19 +120,28 @@ public class TweetEvent extends BaseEvent implements Parcelable {
return accountId; return accountId;
} }
public void setAccountId(long accountId) { public void setAccountId(long accountKey) {
this.accountId = accountId; this.accountId = accountKey;
}
public String getAccountHost() {
return accountHost;
}
public void setAccountHost(String accountHost) {
this.accountHost = accountHost;
} }
@Override @Override
public String toString() { public String toString() {
return "TweetEvent{" + return "TweetEvent{" +
"id=" + id + "id=" + id +
", mAccountKey=" + accountId + ", accountKey=" + accountId +
", userId=" + userId + ", userId=" + userId +
", tweetType=" + tweetType + ", tweetType='" + tweetType + '\'' +
", timelineType=" + timelineType + ", timelineType='" + timelineType + '\'' +
", action=" + action + ", action='" + action + '\'' +
", following=" + following +
"} " + super.toString(); "} " + super.toString();
} }

View File

@ -819,7 +819,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) {
Utils.openMessageConversation(this, -1, -1); Utils.openMessageConversation(this, null, -1);
} else if (TrendsSuggestionsFragment.class == tab.cls) { } else if (TrendsSuggestionsFragment.class == tab.cls) {
openSearchView(null); openSearchView(null);
} else { } else {

View File

@ -30,6 +30,7 @@ import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Parcelable;
import android.support.annotation.CallSuper; import android.support.annotation.CallSuper;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
@ -81,6 +82,7 @@ import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IExtendedActivity; import org.mariotaku.twidere.activity.iface.IExtendedActivity;
import org.mariotaku.twidere.fragment.ProgressDialogFragment; import org.mariotaku.twidere.fragment.ProgressDialogFragment;
import org.mariotaku.twidere.model.AccountKey;
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.provider.CacheProvider; import org.mariotaku.twidere.provider.CacheProvider;
@ -824,7 +826,7 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
@Override @Override
protected Object getDownloadExtra() { protected Object getDownloadExtra() {
final MediaExtra mediaExtra = new MediaExtra(); final MediaExtra mediaExtra = new MediaExtra();
mediaExtra.setAccountId(getArguments().getLong(EXTRA_ACCOUNT_ID, -1)); mediaExtra.setAccountKey(getArguments().<AccountKey>getParcelable(EXTRA_ACCOUNT_KEY));
final Uri origDownloadUri = super.getDownloadUri(); final Uri origDownloadUri = super.getDownloadUri();
final Uri downloadUri = getDownloadUri(); final Uri downloadUri = getDownloadUri();
if (origDownloadUri != null && downloadUri != null) { if (origDownloadUri != null && downloadUri != null) {

View File

@ -56,6 +56,8 @@ import android.widget.TextView;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter; import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter;
import org.mariotaku.twidere.fragment.support.UserFragment; import org.mariotaku.twidere.fragment.support.UserFragment;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory; import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory;
import org.mariotaku.twidere.provider.TwidereDataStore.Suggestions; import org.mariotaku.twidere.provider.TwidereDataStore.Suggestions;
@ -142,10 +144,12 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On
@Override @Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) { public Loader<Cursor> onCreateLoader(int id, Bundle args) {
final long accountId = getAccountId(); final AccountKey accountId = getSelectedAccountKey();
final Uri.Builder builder = Suggestions.Search.CONTENT_URI.buildUpon(); final Uri.Builder builder = Suggestions.Search.CONTENT_URI.buildUpon();
builder.appendQueryParameter(QUERY_PARAM_QUERY, ParseUtils.parseString(mSearchQuery.getText())); builder.appendQueryParameter(QUERY_PARAM_QUERY, ParseUtils.parseString(mSearchQuery.getText()));
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_ID, ParseUtils.parseString(accountId)); if (accountId != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountId.toString());
}
return new CursorLoader(this, builder.build(), Suggestions.Search.COLUMNS, null, null, null); return new CursorLoader(this, builder.build(), Suggestions.Search.COLUMNS, null, null, null);
} }
@ -170,20 +174,20 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On
final SuggestionItem item = mUsersSearchAdapter.getSuggestionItem(position); final SuggestionItem item = mUsersSearchAdapter.getSuggestionItem(position);
switch (mUsersSearchAdapter.getItemViewType(position)) { switch (mUsersSearchAdapter.getItemViewType(position)) {
case SuggestionsAdapter.VIEW_TYPE_USER_SUGGESTION_ITEM: { case SuggestionsAdapter.VIEW_TYPE_USER_SUGGESTION_ITEM: {
IntentUtils.openUserProfile(this, getAccountId(), item.extra_id, item.summary, null, IntentUtils.openUserProfile(this, getSelectedAccountKey(), item.extra_id, item.summary, null,
true, UserFragment.Referral.DIRECT); true, UserFragment.Referral.DIRECT);
finish(); finish();
break; break;
} }
case SuggestionsAdapter.VIEW_TYPE_USER_SCREEN_NAME: { case SuggestionsAdapter.VIEW_TYPE_USER_SCREEN_NAME: {
IntentUtils.openUserProfile(this, getAccountId(), -1, item.title, null, true, IntentUtils.openUserProfile(this, getSelectedAccountKey(), -1, item.title, null, true,
UserFragment.Referral.DIRECT); UserFragment.Referral.DIRECT);
finish(); finish();
break; break;
} }
case SuggestionsAdapter.VIEW_TYPE_SAVED_SEARCH: case SuggestionsAdapter.VIEW_TYPE_SAVED_SEARCH:
case SuggestionsAdapter.VIEW_TYPE_SEARCH_HISTORY: { case SuggestionsAdapter.VIEW_TYPE_SEARCH_HISTORY: {
Utils.openSearch(this, getAccountId(), item.title); Utils.openSearch(this, getSelectedAccountKey(), item.title);
finish(); finish();
break; break;
} }
@ -284,13 +288,13 @@ public class QuickSearchBarActivity extends ThemedFragmentActivity implements On
if (isFinishing()) return; if (isFinishing()) return;
final String query = ParseUtils.parseString(mSearchQuery.getText()); final String query = ParseUtils.parseString(mSearchQuery.getText());
if (TextUtils.isEmpty(query)) return; if (TextUtils.isEmpty(query)) return;
final long accountId = mAccountSpinner.getSelectedItemId(); Utils.openSearch(this, getSelectedAccountKey(), query);
Utils.openSearch(this, accountId, query);
finish(); finish();
} }
private long getAccountId() { private AccountKey getSelectedAccountKey() {
return mAccountSpinner.getSelectedItemId(); final ParcelableAccount account = (ParcelableAccount) mAccountSpinner.getSelectedItem();
return new AccountKey(account.account_id, account.account_host);
} }
private void updateWindowAttributes() { private void updateWindowAttributes() {

View File

@ -36,6 +36,7 @@ import org.mariotaku.twidere.adapter.iface.IActivitiesAdapter;
import org.mariotaku.twidere.api.twitter.model.Activity; import org.mariotaku.twidere.api.twitter.model.Activity;
import org.mariotaku.twidere.fragment.support.CursorActivitiesFragment; import org.mariotaku.twidere.fragment.support.CursorActivitiesFragment;
import org.mariotaku.twidere.fragment.support.UserFragment; import org.mariotaku.twidere.fragment.support.UserFragment;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableActivity; import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
@ -438,8 +439,9 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
final ParcelableActivity activity = adapter.getActivity(position); final ParcelableActivity activity = adapter.getActivity(position);
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity); final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
assert status != null; assert status != null;
IntentUtils.openUserProfile(context, status.account_id, status.user_id, IntentUtils.openUserProfile(context, new AccountKey(status.account_id,
status.user_screen_name, null, true, UserFragment.Referral.TIMELINE_STATUS); status.account_host), status.user_id, status.user_screen_name, null, true,
UserFragment.Referral.TIMELINE_STATUS);
} }
@Override @Override

View File

@ -87,7 +87,7 @@ public class DraftsAdapter extends SimpleCursorAdapter implements Constants {
case Draft.Action.QUOTE: { case Draft.Action.QUOTE: {
final ParcelableMedia[] media = ParcelableMediaUtils.fromMediaUpdates(mediaUpdates); final ParcelableMedia[] media = ParcelableMediaUtils.fromMediaUpdates(mediaUpdates);
holder.media_preview_container.setVisibility(View.VISIBLE); holder.media_preview_container.setVisibility(View.VISIBLE);
holder.media_preview_container.displayMedia(media, mImageLoader, -1, -1, null, holder.media_preview_container.displayMedia(media, mImageLoader, null, -1, null,
mMediaLoadingHandler); mMediaLoadingHandler);
break; break;
} }

View File

@ -29,6 +29,7 @@ import android.view.ViewGroup;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IDirectMessagesAdapter; import org.mariotaku.twidere.adapter.iface.IDirectMessagesAdapter;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableDirectMessage; import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.model.ParcelableDirectMessageCursorIndices; import org.mariotaku.twidere.model.ParcelableDirectMessageCursorIndices;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
@ -205,7 +206,7 @@ public class MessageConversationAdapter extends BaseRecyclerViewAdapter<ViewHold
} }
@Override @Override
public void onMediaClick(View view, ParcelableMedia media, long accountId, long extraId) { public void onMediaClick(View view, ParcelableMedia media, AccountKey accountKey, long extraId) {
final MessageConversationAdapter adapter = adapterRef.get(); final MessageConversationAdapter adapter = adapterRef.get();
IntentUtils.openMedia(adapter.getContext(), adapter.getDirectMessage((int) extraId), media, IntentUtils.openMedia(adapter.getContext(), adapter.getDirectMessage((int) extraId), media,
null, true); null, true);

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.adapter;
import android.content.Context; import android.content.Context;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.view.holder.UserViewHolder; import org.mariotaku.twidere.view.holder.UserViewHolder;
@ -102,7 +103,11 @@ public class ParcelableUsersAdapter extends AbsUsersAdapter<List<ParcelableUser>
return true; return true;
} }
public int findPosition(long accountId, long userId) { public int findPosition(AccountKey accountKey, long userId) {
return findPosition(accountKey.getId(), accountKey.getHost(), userId);
}
public int findPosition(long accountId, String accountHost, long 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);

View File

@ -33,6 +33,7 @@ import com.commonsware.cwac.layouts.AspectLockedFrameLayout;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter; import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
import org.mariotaku.twidere.graphic.like.LikeAnimationDrawable; import org.mariotaku.twidere.graphic.like.LikeAnimationDrawable;
import org.mariotaku.twidere.model.AccountKey;
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.util.ParcelableMediaUtils; import org.mariotaku.twidere.model.util.ParcelableMediaUtils;
@ -100,7 +101,8 @@ public class StaggeredGridParcelableStatusesAdapter extends AbsParcelableStatuse
mediaImageView.setHasPlayIcon(ParcelableMediaUtils.hasPlayIcon(firstMedia.type)); mediaImageView.setHasPlayIcon(ParcelableMediaUtils.hasPlayIcon(firstMedia.type));
loader.displayProfileImage(mediaProfileImageView, status.user_profile_image_url); loader.displayProfileImage(mediaProfileImageView, status.user_profile_image_url);
loader.displayPreviewImageWithCredentials(mediaImageView, firstMedia.preview_url, loader.displayPreviewImageWithCredentials(mediaImageView, firstMedia.preview_url,
status.account_id, adapter.getMediaLoadingHandler()); new AccountKey(status.account_id, status.account_host),
adapter.getMediaLoadingHandler());
} }
@Override @Override
@ -136,7 +138,7 @@ public class StaggeredGridParcelableStatusesAdapter extends AbsParcelableStatuse
} }
@Override @Override
public void onMediaClick(View view, ParcelableMedia media, long accountId, long extraId) { public void onMediaClick(View view, ParcelableMedia media, AccountKey accountKey, long extraId) {
} }
@Override @Override

View File

@ -406,8 +406,9 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListRecyclerVi
@Override @Override
public void onUserProfileClick(IStatusViewHolder holder, ParcelableStatus status, int position) { public void onUserProfileClick(IStatusViewHolder holder, ParcelableStatus status, int position) {
final FragmentActivity activity = getActivity(); final FragmentActivity activity = getActivity();
IntentUtils.openUserProfile(activity, status.account_id, status.user_id, IntentUtils.openUserProfile(activity, new AccountKey(status.account_id, status.account_host),
status.user_screen_name, null, true, UserFragment.Referral.TIMELINE_STATUS); status.user_id, status.user_screen_name, null, true,
UserFragment.Referral.TIMELINE_STATUS);
} }
@Override @Override

View File

@ -34,6 +34,7 @@ import org.mariotaku.twidere.adapter.AbsUsersAdapter;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition; import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
import org.mariotaku.twidere.adapter.iface.IUsersAdapter.UserAdapterListener; import org.mariotaku.twidere.adapter.iface.IUsersAdapter.UserAdapterListener;
import org.mariotaku.twidere.loader.iface.IExtendedLoader; import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.util.IntentUtils; import org.mariotaku.twidere.util.IntentUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
@ -112,8 +113,8 @@ abstract class AbsUsersFragment<Data> extends AbsContentListRecyclerViewFragment
public void onUserClick(UserViewHolder holder, int position) { public void onUserClick(UserViewHolder holder, int position) {
final ParcelableUser user = getAdapter().getUser(position); final ParcelableUser user = getAdapter().getUser(position);
final FragmentActivity activity = getActivity(); final FragmentActivity activity = getActivity();
IntentUtils.openUserProfile(activity, user.account_id, user.id, user.screen_name, null, IntentUtils.openUserProfile(activity, new AccountKey(user.account_id, user.account_host),
true, getUserReferral()); user.id, user.screen_name, null, true, getUserReferral());
} }
@UserFragment.Referral @UserFragment.Referral

View File

@ -248,8 +248,9 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
final ParcelableAccount account = mAccountsAdapter.getSelectedAccount(); final ParcelableAccount account = mAccountsAdapter.getSelectedAccount();
if (account == null) return; if (account == null) return;
final FragmentActivity activity = getActivity(); final FragmentActivity activity = getActivity();
IntentUtils.openUserProfile(activity, account.account_id, account.account_id, IntentUtils.openUserProfile(activity, new AccountKey(account.account_id,
account.screen_name, null, true, UserFragment.Referral.SELF_PROFILE); account.account_host), account.account_id, account.screen_name, null, true,
UserFragment.Referral.SELF_PROFILE);
break; break;
} }
} }

View File

@ -44,6 +44,7 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity; import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.SignInActivity; import org.mariotaku.twidere.activity.support.SignInActivity;
import org.mariotaku.twidere.adapter.AccountsAdapter; import org.mariotaku.twidere.adapter.AccountsAdapter;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts; import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages; import org.mariotaku.twidere.provider.TwidereDataStore.DirectMessages;
@ -148,8 +149,9 @@ public class AccountsManagerFragment extends BaseSupportFragment implements Load
@Override @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final ParcelableAccount account = mAdapter.getAccount(position); final ParcelableAccount account = mAdapter.getAccount(position);
IntentUtils.openUserProfile(getActivity(), account.account_id, account.account_id, account.screen_name, IntentUtils.openUserProfile(getActivity(), new AccountKey(account.account_id,
null, true, UserFragment.Referral.SELF_PROFILE); account.account_host), account.account_id, account.screen_name, null, true,
UserFragment.Referral.SELF_PROFILE);
} }
@Override @Override

View File

@ -258,6 +258,11 @@ public abstract class CursorStatusesFragment extends AbsStatusesFragment<List<Pa
public long[] getMaxIds() { public long[] getMaxIds() {
return getOldestStatusIds(getAccountKeys()); return getOldestStatusIds(getAccountKeys());
} }
@Override
public boolean hasMaxIds() {
return true;
}
}); });
} }
@ -271,6 +276,11 @@ public abstract class CursorStatusesFragment extends AbsStatusesFragment<List<Pa
return CursorStatusesFragment.this.getAccountKeys(); return CursorStatusesFragment.this.getAccountKeys();
} }
@Override
public boolean hasMaxIds() {
return false;
}
@Nullable @Nullable
@Override @Override
public long[] getSinceIds() { public long[] getSinceIds() {

View File

@ -201,8 +201,8 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
@Override @Override
public void onUserClick(int position, DirectMessageEntry entry) { public void onUserClick(int position, DirectMessageEntry entry) {
IntentUtils.openUserProfile(getActivity(), entry.account_id, entry.conversation_id, IntentUtils.openUserProfile(getActivity(), new AccountKey(entry.account_id, entry.account_host),
entry.screen_name, null, true, null); entry.conversation_id, entry.screen_name, null, true, null);
} }
@Subscribe @Subscribe

View File

@ -24,6 +24,8 @@ import android.support.annotation.NonNull;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import org.mariotaku.twidere.annotation.ReadPositionTag; import org.mariotaku.twidere.annotation.ReadPositionTag;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.RefreshTaskParam;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses; import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ErrorInfoStore; import org.mariotaku.twidere.util.ErrorInfoStore;
@ -70,11 +72,11 @@ public class HomeTimelineFragment extends CursorStatusesFragment {
} }
@Override @Override
public boolean getStatuses(long[] accountIds, long[] maxIds, long[] sinceIds) { public boolean getStatuses(RefreshTaskParam param) {
final AsyncTwitterWrapper twitter = mTwitterWrapper; final AsyncTwitterWrapper twitter = mTwitterWrapper;
if (twitter == null) return false; if (twitter == null) return false;
if (maxIds == null) return twitter.refreshAll(accountIds); if (!param.hasMaxIds()) return twitter.refreshAll(param.getAccountKeys());
return twitter.getHomeTimelineAsync(accountIds, maxIds, sinceIds); return twitter.getHomeTimelineAsync(param);
} }
@Override @Override
@ -82,7 +84,7 @@ public class HomeTimelineFragment extends CursorStatusesFragment {
super.setUserVisibleHint(isVisibleToUser); super.setUserVisibleHint(isVisibleToUser);
final FragmentActivity activity = getActivity(); final FragmentActivity activity = getActivity();
if (isVisibleToUser && activity != null) { if (isVisibleToUser && activity != null) {
for (long accountId : getAccountKeys()) { for (AccountKey accountId : getAccountKeys()) {
final String tag = "home_" + accountId; final String tag = "home_" + accountId;
mNotificationManager.cancel(tag, NOTIFICATION_ID_HOME_TIMELINE); mNotificationManager.cancel(tag, NOTIFICATION_ID_HOME_TIMELINE);
} }

View File

@ -30,6 +30,7 @@ import org.mariotaku.twidere.adapter.ParcelableUsersAdapter;
import org.mariotaku.twidere.adapter.iface.IUsersAdapter; import org.mariotaku.twidere.adapter.iface.IUsersAdapter;
import org.mariotaku.twidere.loader.support.IDsUsersLoader; import org.mariotaku.twidere.loader.support.IDsUsersLoader;
import org.mariotaku.twidere.loader.support.IncomingFriendshipsLoader; import org.mariotaku.twidere.loader.support.IncomingFriendshipsLoader;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.message.FollowRequestTaskEvent; import org.mariotaku.twidere.model.message.FollowRequestTaskEvent;
import org.mariotaku.twidere.view.holder.UserViewHolder; import org.mariotaku.twidere.view.holder.UserViewHolder;
@ -50,9 +51,11 @@ public class IncomingFriendshipsFragment 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,
final boolean fromUser) {
final AccountKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final AccountKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final IncomingFriendshipsLoader loader = new IncomingFriendshipsLoader(context, accountId, getData(), fromUser); final IncomingFriendshipsLoader loader = new IncomingFriendshipsLoader(context, accountKey,
getData(), fromUser);
loader.setCursor(getNextCursor()); loader.setCursor(getNextCursor());
return loader; return loader;
} }
@ -70,7 +73,8 @@ public class IncomingFriendshipsFragment extends CursorSupportUsersListFragment
final AbsUsersAdapter<List<ParcelableUser>> adapter = getAdapter(); final AbsUsersAdapter<List<ParcelableUser>> adapter = getAdapter();
final ParcelableUser user = adapter.getUser(position); final ParcelableUser user = adapter.getUser(position);
if (user == null) return; if (user == null) return;
mTwitterWrapper.acceptFriendshipAsync(user.account_id, user.id); mTwitterWrapper.acceptFriendshipAsync(new AccountKey(user.account_id, user.account_host),
user.id);
} }
@Override @Override
@ -78,7 +82,8 @@ public class IncomingFriendshipsFragment extends CursorSupportUsersListFragment
final AbsUsersAdapter<List<ParcelableUser>> adapter = getAdapter(); final AbsUsersAdapter<List<ParcelableUser>> adapter = getAdapter();
final ParcelableUser user = adapter.getUser(position); final ParcelableUser user = adapter.getUser(position);
if (user == null) return; if (user == null) return;
mTwitterWrapper.denyFriendshipAsync(user.account_id, user.id); mTwitterWrapper.denyFriendshipAsync(new AccountKey(user.account_id, user.account_host),
user.id);
} }
@Subscribe @Subscribe

View File

@ -30,6 +30,7 @@ import org.mariotaku.sqliteqb.library.Expression;
import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter; import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter;
import org.mariotaku.twidere.annotation.ReadPositionTag; import org.mariotaku.twidere.annotation.ReadPositionTag;
import org.mariotaku.twidere.api.twitter.model.Activity; import org.mariotaku.twidere.api.twitter.model.Activity;
import org.mariotaku.twidere.model.RefreshTaskParam;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities; import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.util.ErrorInfoStore; import org.mariotaku.twidere.util.ErrorInfoStore;
@ -38,8 +39,8 @@ import edu.tsinghua.hotmobi.model.TimelineType;
public class InteractionsTimelineFragment extends CursorActivitiesFragment { public class InteractionsTimelineFragment extends CursorActivitiesFragment {
@Override @Override
public boolean getActivities(long[] accountIds, long[] maxIds, long[] sinceIds) { public boolean getActivities(RefreshTaskParam param) {
mTwitterWrapper.getActivitiesAboutMeAsync(accountIds, maxIds, sinceIds); mTwitterWrapper.getActivitiesAboutMeAsync(param);
return true; return true;
} }

View File

@ -83,6 +83,7 @@ import org.mariotaku.twidere.adapter.SimpleParcelableUsersAdapter;
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter.MenuButtonClickListener; import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter.MenuButtonClickListener;
import org.mariotaku.twidere.annotation.CustomTabType; import org.mariotaku.twidere.annotation.CustomTabType;
import org.mariotaku.twidere.loader.support.UserSearchLoader; import org.mariotaku.twidere.loader.support.UserSearchLoader;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.model.ParcelableDirectMessage; import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
@ -137,11 +138,11 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
mUsersSearchList.setVisibility(View.GONE); mUsersSearchList.setVisibility(View.GONE);
mUsersSearchEmpty.setVisibility(View.GONE); mUsersSearchEmpty.setVisibility(View.GONE);
mUsersSearchProgress.setVisibility(View.VISIBLE); mUsersSearchProgress.setVisibility(View.VISIBLE);
final long accountId = args.getLong(EXTRA_ACCOUNT_ID); final AccountKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final String query = args.getString(EXTRA_QUERY); final String query = args.getString(EXTRA_QUERY);
final boolean fromCache = args.getBoolean(EXTRA_FROM_CACHE); final boolean fromCache = args.getBoolean(EXTRA_FROM_CACHE);
final boolean fromUser = args.getBoolean(EXTRA_FROM_USER, false); final boolean fromUser = args.getBoolean(EXTRA_FROM_USER, false);
return new CacheUserSearchLoader(MessagesConversationFragment.this, accountId, query, return new CacheUserSearchLoader(MessagesConversationFragment.this, accountKey, query,
fromCache, fromUser); fromCache, fromUser);
} }
@ -304,13 +305,13 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
} else if (args.containsKey(EXTRA_ACCOUNT_ID)) { } else if (args.containsKey(EXTRA_ACCOUNT_ID)) {
final AccountKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final AccountKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
final long userId = args.getLong(EXTRA_RECIPIENT_ID, -1); final long userId = args.getLong(EXTRA_RECIPIENT_ID, -1);
final int accountPos = accountsSpinnerAdapter.findItemPosition(accountId); final int accountPos = accountsSpinnerAdapter.findItemPosition(accountKey.getId());
if (accountPos >= 0) { if (accountPos >= 0) {
mAccountSpinner.setSelection(accountPos); mAccountSpinner.setSelection(accountPos);
} }
account = accountPos >= 0 ? accountsSpinnerAdapter.getItem(accountPos) : account = accountPos >= 0 ? accountsSpinnerAdapter.getItem(accountPos) :
DataStoreUtils.getCredentials(activity, accountId); DataStoreUtils.getCredentials(activity, accountKey);
recipient = Utils.getUserForConversation(activity, accountId, userId); recipient = Utils.getUserForConversation(activity, accountKey, userId);
} else { } else {
account = null; account = null;
recipient = null; recipient = null;
@ -401,8 +402,10 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.delete_all: { case R.id.delete_all: {
if (mAccount == null || mRecipient == null) return true; final ParcelableCredentials account = mAccount;
mTwitterWrapper.destroyMessageConversationAsync(mAccount.account_id, mRecipient.id); if (account == null || mRecipient == null) return true;
mTwitterWrapper.destroyMessageConversationAsync(new AccountKey(account.account_id,
account.account_host), mRecipient.id);
return true; return true;
} }
} }
@ -489,16 +492,16 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
@Override @Override
public boolean onMenuItemClick(final MenuItem item) { public boolean onMenuItemClick(final MenuItem item) {
if (mSelectedDirectMessage != null) { final ParcelableDirectMessage message = mSelectedDirectMessage;
final long message_id = mSelectedDirectMessage.id; if (message != null) {
final long account_id = mSelectedDirectMessage.account_id;
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.delete: { case R.id.delete: {
mTwitterWrapper.destroyDirectMessageAsync(account_id, message_id); mTwitterWrapper.destroyDirectMessageAsync(new AccountKey(message.account_id,
message.account_host), message.id);
break; break;
} }
case R.id.copy: { case R.id.copy: {
if (ClipboardUtils.setText(getActivity(), mSelectedDirectMessage.text_plain)) { if (ClipboardUtils.setText(getActivity(), message.text_plain)) {
Utils.showOkMessage(getActivity(), R.string.text_copied, false); Utils.showOkMessage(getActivity(), R.string.text_copied, false);
} }
break; break;
@ -659,7 +662,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
if (((BaseAppCompatActivity) activity).getKeyMetaState() != 0) return false; if (((BaseAppCompatActivity) activity).getKeyMetaState() != 0) return false;
final ParcelableCredentials account = (ParcelableCredentials) mAccountSpinner.getSelectedItem(); final ParcelableCredentials account = (ParcelableCredentials) mAccountSpinner.getSelectedItem();
if (account == null) return false; if (account == null) return false;
mEditText.setAccountKey(account.account_id); mEditText.setAccountKey(new AccountKey(account.account_id, account.account_host));
searchUsers(account.account_id, ParseUtils.parseString(mEditUserQuery.getText()), false); searchUsers(account.account_id, ParseUtils.parseString(mEditUserQuery.getText()), false);
return true; return true;
} }
@ -678,7 +681,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
public void afterTextChanged(Editable s) { public void afterTextChanged(Editable s) {
final ParcelableCredentials account = (ParcelableCredentials) mAccountSpinner.getSelectedItem(); final ParcelableCredentials account = (ParcelableCredentials) mAccountSpinner.getSelectedItem();
if (account == null) return; if (account == null) return;
mEditText.setAccountKey(account.account_id); mEditText.setAccountKey(new AccountKey(account.account_id, account.account_host));
searchUsers(account.account_id, ParseUtils.parseString(s), true); searchUsers(account.account_id, ParseUtils.parseString(s), true);
} }
}); });
@ -831,8 +834,9 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
private final boolean mFromCache; private final boolean mFromCache;
private final UserColorNameManager mUserColorNameManager; private final UserColorNameManager mUserColorNameManager;
public CacheUserSearchLoader(MessagesConversationFragment fragment, long accountId, String query, boolean fromCache, boolean fromUser) { public CacheUserSearchLoader(MessagesConversationFragment fragment, AccountKey accountKey,
super(fragment.getContext(), accountId, query, 0, null, fromUser); String query, boolean fromCache, boolean fromUser) {
super(fragment.getContext(), accountKey, query, 0, null, fromUser);
mUserColorNameManager = fragment.mUserColorNameManager; mUserColorNameManager = fragment.mUserColorNameManager;
mFromCache = fromCache; mFromCache = fromCache;
} }
@ -896,9 +900,10 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
final Bundle args = getArguments(); final Bundle args = getArguments();
final ParcelableCredentials account = args.getParcelable(EXTRA_ACCOUNT); final ParcelableCredentials account = args.getParcelable(EXTRA_ACCOUNT);
final ParcelableUser user = args.getParcelable(EXTRA_USER); final ParcelableUser user = args.getParcelable(EXTRA_USER);
if (account == null || user == null) return;
final AsyncTwitterWrapper twitter = mTwitterWrapper; final AsyncTwitterWrapper twitter = mTwitterWrapper;
twitter.destroyMessageConversationAsync(account.account_id, user.id); if (account == null || user == null || twitter == null) return;
twitter.destroyMessageConversationAsync(new AccountKey(account.account_id,
account.account_host), user.id);
break; break;
} }
} }

View File

@ -25,13 +25,16 @@ import android.support.annotation.NonNull;
import org.mariotaku.twidere.loader.support.CursorSupportUsersLoader; import org.mariotaku.twidere.loader.support.CursorSupportUsersLoader;
import org.mariotaku.twidere.loader.support.MutesUsersLoader; import org.mariotaku.twidere.loader.support.MutesUsersLoader;
import org.mariotaku.twidere.model.AccountKey;
public class MutesUsersListFragment extends CursorSupportUsersListFragment { public class MutesUsersListFragment extends CursorSupportUsersListFragment {
@Override @Override
public CursorSupportUsersLoader onCreateUsersLoader(final Context context, @NonNull final Bundle args, boolean fromUser) { public CursorSupportUsersLoader onCreateUsersLoader(final Context context, @NonNull final Bundle args, boolean fromUser) {
final AccountKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY); final AccountKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
return new MutesUsersLoader(context, accountId, getNextCursor(), getData(), fromUser); final MutesUsersLoader loader = new MutesUsersLoader(context, accountKey, getData(), fromUser);
loader.setCursor(getNextCursor());
return loader;
} }
} }

View File

@ -462,15 +462,15 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
@Override @Override
public void onUserProfileClick(IStatusViewHolder holder, ParcelableStatus status, int position) { public void onUserProfileClick(IStatusViewHolder holder, ParcelableStatus status, int position) {
final FragmentActivity activity = getActivity(); final FragmentActivity activity = getActivity();
IntentUtils.openUserProfile(activity, status.account_id, status.user_id, IntentUtils.openUserProfile(activity, new AccountKey(status.account_id, status.account_host),
status.user_screen_name, null, true, UserFragment.Referral.TIMELINE_STATUS); status.user_id, status.user_screen_name, null, true, UserFragment.Referral.TIMELINE_STATUS);
} }
@Override @Override
public void onMediaClick(View view, ParcelableMedia media, long accountId, long extraId) { public void onMediaClick(View view, ParcelableMedia media, AccountKey accountKey, long extraId) {
final ParcelableStatus status = mStatusAdapter.getStatus(); final ParcelableStatus status = mStatusAdapter.getStatus();
if (status == null) return; if (status == null) return;
IntentUtils.openMediaDirectly(getActivity(), accountId, status, media, null, true); IntentUtils.openMediaDirectly(getActivity(), accountKey, status, media, null, true);
// BEGIN HotMobi // BEGIN HotMobi
MediaEvent event = MediaEvent.create(getActivity(), status, media, TimelineType.OTHER, MediaEvent event = MediaEvent.create(getActivity(), status, media, TimelineType.OTHER,
mStatusAdapter.isMediaPreviewEnabled()); mStatusAdapter.isMediaPreviewEnabled());
@ -545,9 +545,9 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
@Override @Override
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 long accountId = fragmentArgs.getLong(EXTRA_ACCOUNT_ID, -1); final AccountKey accountKey = fragmentArgs.getParcelable(EXTRA_ACCOUNT_KEY);
final long statusId = fragmentArgs.getLong(EXTRA_STATUS_ID, -1); final long statusId = fragmentArgs.getLong(EXTRA_STATUS_ID, -1);
return new ParcelableStatusLoader(getActivity(), false, fragmentArgs, accountId, statusId); return new ParcelableStatusLoader(getActivity(), false, fragmentArgs, accountKey, statusId);
} }
@Override @Override
@ -592,7 +592,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final TweetEvent event = mStatusEvent; final TweetEvent event = mStatusEvent;
if (event == null) return; if (event == null) return;
event.markEnd(); event.markEnd();
HotMobiLogger.getInstance(getActivity()).log(event.getAccountId(), event); final AccountKey accountKey = new AccountKey(event.getAccountId(), event.getAccountHost());
HotMobiLogger.getInstance(getActivity()).log(accountKey, event);
} }
@Override @Override
@ -673,7 +674,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private void loadConversation(ParcelableStatus status, long sinceId, long maxId) { private void loadConversation(ParcelableStatus status, long sinceId, long maxId) {
if (status == null) return; if (status == null) return;
final Bundle args = new Bundle(); final Bundle args = new Bundle();
args.putLong(EXTRA_ACCOUNT_ID, status.account_id); args.putParcelable(EXTRA_ACCOUNT_KEY, new AccountKey(status.account_id, status.account_host));
args.putLong(EXTRA_STATUS_ID, status.is_retweet ? status.retweet_id : status.id); args.putLong(EXTRA_STATUS_ID, status.is_retweet ? status.retweet_id : status.id);
args.putLong(EXTRA_SINCE_ID, sinceId); args.putLong(EXTRA_SINCE_ID, sinceId);
args.putLong(EXTRA_MAX_ID, maxId); args.putLong(EXTRA_MAX_ID, maxId);
@ -1016,7 +1017,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final CharSequence quotedText = HtmlSpanBuilder.fromHtml(status.quoted_text_html, final CharSequence quotedText = HtmlSpanBuilder.fromHtml(status.quoted_text_html,
status.text_unescaped); status.text_unescaped);
if (quotedText instanceof Spanned) { if (quotedText instanceof Spanned) {
quotedTextView.setText(linkify.applyAllLinks(quotedText, status.account_id, quotedTextView.setText(linkify.applyAllLinks(quotedText,
new AccountKey(status.account_id, status.account_host),
layoutPosition, status.is_possibly_sensitive, skipLinksInText)); layoutPosition, status.is_possibly_sensitive, skipLinksInText));
} }
@ -1070,8 +1072,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final CharSequence text = HtmlSpanBuilder.fromHtml(status.text_html, final CharSequence text = HtmlSpanBuilder.fromHtml(status.text_html,
status.text_unescaped); status.text_unescaped);
if (text instanceof Spanned) { if (text instanceof Spanned) {
textView.setText(linkify.applyAllLinks(text, status.account_id, layoutPosition, textView.setText(linkify.applyAllLinks(text, new AccountKey(status.account_id,
status.is_possibly_sensitive, skipLinksInText)); status.account_host), layoutPosition, status.is_possibly_sensitive, skipLinksInText));
} }
final ParcelableLocation location; final ParcelableLocation location;
@ -1125,8 +1127,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
mediaPreviewContainer.setVisibility(View.VISIBLE); mediaPreviewContainer.setVisibility(View.VISIBLE);
mediaPreview.setVisibility(View.VISIBLE); mediaPreview.setVisibility(View.VISIBLE);
mediaPreviewLoad.setVisibility(View.GONE); mediaPreviewLoad.setVisibility(View.GONE);
mediaPreview.displayMedia(media, loader, status.account_id, -1, adapter.getFragment(), mediaPreview.displayMedia(media, loader, new AccountKey(status.account_id,
adapter.getMediaLoadingHandler()); status.account_host), -1, adapter.getFragment(), adapter.getMediaLoadingHandler());
} else { } else {
mediaPreviewContainer.setVisibility(View.VISIBLE); mediaPreviewContainer.setVisibility(View.VISIBLE);
mediaPreview.setVisibility(View.GONE); mediaPreview.setVisibility(View.GONE);
@ -1190,6 +1192,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
final ParcelableStatus status = adapter.getStatus(getLayoutPosition()); final ParcelableStatus status = adapter.getStatus(getLayoutPosition());
final StatusFragment fragment = adapter.getFragment(); final StatusFragment fragment = adapter.getFragment();
if (status == null || fragment == null) return; if (status == null || fragment == null) return;
final AccountKey accountKey = new AccountKey(status.account_id, status.account_host);
switch (v.getId()) { switch (v.getId()) {
case R.id.media_preview_load: { case R.id.media_preview_load: {
if (adapter.isSensitiveContentEnabled() || !status.is_possibly_sensitive) { if (adapter.isSensitiveContentEnabled() || !status.is_possibly_sensitive) {
@ -1202,13 +1205,13 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
} }
case R.id.profile_container: { case R.id.profile_container: {
final FragmentActivity activity = fragment.getActivity(); final FragmentActivity activity = fragment.getActivity();
IntentUtils.openUserProfile(activity, status.account_id, status.user_id, IntentUtils.openUserProfile(activity, accountKey, status.user_id,
status.user_screen_name, null, true, UserFragment.Referral.STATUS); status.user_screen_name, null, true, UserFragment.Referral.STATUS);
break; break;
} }
case R.id.retweeted_by: { case R.id.retweeted_by: {
if (status.retweet_id > 0) { if (status.retweet_id > 0) {
IntentUtils.openUserProfile(adapter.getContext(), status.account_id, IntentUtils.openUserProfile(adapter.getContext(), accountKey,
status.retweeted_by_user_id, status.retweeted_by_user_screen_name, status.retweeted_by_user_id, status.retweeted_by_user_screen_name,
null, true, UserFragment.Referral.STATUS); null, true, UserFragment.Referral.STATUS);
} }
@ -1221,13 +1224,13 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
break; break;
} }
case R.id.quoted_name_container: { case R.id.quoted_name_container: {
IntentUtils.openUserProfile(adapter.getContext(), status.account_id, IntentUtils.openUserProfile(adapter.getContext(), accountKey,
status.quoted_user_id, status.quoted_user_screen_name, null, true, status.quoted_user_id, status.quoted_user_screen_name, null, true,
UserFragment.Referral.STATUS); UserFragment.Referral.STATUS);
break; break;
} }
case R.id.quote_original_link: { case R.id.quote_original_link: {
Utils.openStatus(adapter.getContext(), status.account_id, status.quoted_id); Utils.openStatus(adapter.getContext(), accountKey, status.quoted_id);
break; break;
} }
case R.id.translate_label: { case R.id.translate_label: {
@ -1590,7 +1593,8 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
} }
@Override @Override
public void onLinkClick(String link, String orig, long accountId, long extraId, int type, boolean sensitive, int start, int end) { public void onLinkClick(final String link, final String orig, final AccountKey accountKey,
long extraId, int type, boolean sensitive, int start, int end) {
final ParcelableStatus status = adapter.getStatus(); final ParcelableStatus status = adapter.getStatus();
ParcelableMedia current; ParcelableMedia current;
if ((current = ParcelableMediaUtils.findByUrl(status.media, link)) != null && if ((current = ParcelableMediaUtils.findByUrl(status.media, link)) != null &&
@ -1607,7 +1611,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
expandOrOpenMedia(null); expandOrOpenMedia(null);
return; return;
} }
super.onLinkClick(link, orig, accountId, extraId, type, sensitive, start, end); super.onLinkClick(link, orig, accountKey, extraId, type, sensitive, start, end);
} }
private void expandOrOpenMedia(ParcelableMedia current) { private void expandOrOpenMedia(ParcelableMedia current) {

View File

@ -41,11 +41,11 @@ public class UserFollowersFragment extends CursorSupportUsersListFragment {
if (getActivity() == null || !isAdded() || isDetached()) return; if (getActivity() == null || !isAdded() || isDetached()) return;
final String action = intent.getAction(); final String action = intent.getAction();
if (BROADCAST_MULTI_BLOCKSTATE_CHANGED.equals(action)) { if (BROADCAST_MULTI_BLOCKSTATE_CHANGED.equals(action)) {
final long account_id = intent.getLongExtra(EXTRA_ACCOUNT_ID, -1); final AccountKey accountKey = intent.getParcelableExtra(EXTRA_ACCOUNT_KEY);
final String screen_name = getAccountScreenName(getActivity(), account_id); final String screen_name = getAccountScreenName(getActivity(), accountKey);
final Bundle args = getArguments(); final Bundle args = getArguments();
if (args == null) return; if (args == null) return;
if (account_id > 0 && args.getLong(EXTRA_USER_ID, -1) == account_id || screen_name != null if (accountKey != null && accountKey.getId() == args.getLong(EXTRA_USER_ID, -1) || screen_name != null
&& screen_name.equalsIgnoreCase(args.getString(EXTRA_SCREEN_NAME))) { && screen_name.equalsIgnoreCase(args.getString(EXTRA_SCREEN_NAME))) {
removeUsers(intent.getLongArrayExtra(EXTRA_USER_IDS)); removeUsers(intent.getLongArrayExtra(EXTRA_USER_IDS));
} }

View File

@ -1318,7 +1318,8 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
ParcelableMedia profileImage = ParcelableMediaUtils.image(url); ParcelableMedia profileImage = ParcelableMediaUtils.image(url);
profileImage.type = ParcelableMedia.Type.IMAGE; profileImage.type = ParcelableMedia.Type.IMAGE;
final ParcelableMedia[] media = {profileImage}; final ParcelableMedia[] media = {profileImage};
IntentUtils.openMedia(activity, user.account_id, false, null, media, null, true); IntentUtils.openMedia(activity, new AccountKey(user.account_id, user.account_host),
false, null, media, null, true);
break; break;
} }
case R.id.profile_banner: { case R.id.profile_banner: {
@ -1327,7 +1328,8 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
ParcelableMedia profileBanner = ParcelableMediaUtils.image(url); ParcelableMedia profileBanner = ParcelableMediaUtils.image(url);
profileBanner.type = ParcelableMedia.Type.IMAGE; profileBanner.type = ParcelableMedia.Type.IMAGE;
final ParcelableMedia[] media = {profileBanner}; final ParcelableMedia[] media = {profileBanner};
IntentUtils.openMedia(activity, user.account_id, false, null, media, null, true); IntentUtils.openMedia(activity, new AccountKey(user.account_id, user.account_host),
false, null, media, null, true);
break; break;
} }
case R.id.listed_container: { case R.id.listed_container: {
@ -1364,8 +1366,8 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
if (user == null) return; if (user == null) return;
switch (type) { switch (type) {
case TwidereLinkify.LINK_TYPE_MENTION: { case TwidereLinkify.LINK_TYPE_MENTION: {
IntentUtils.openUserProfile(getActivity(), user.account_id, -1, link, null, IntentUtils.openUserProfile(getActivity(), new AccountKey(user.account_id,
true, Referral.USER_MENTION); user.account_host), -1, link, null, true, Referral.USER_MENTION);
break; break;
} }
case TwidereLinkify.LINK_TYPE_HASHTAG: { case TwidereLinkify.LINK_TYPE_HASHTAG: {

View File

@ -354,8 +354,9 @@ public class UserListFragment extends BaseSupportFragment implements OnClickList
case R.id.profile_image: { case R.id.profile_image: {
final ParcelableUserList userList = mUserList; final ParcelableUserList userList = mUserList;
if (userList == null) return; if (userList == null) return;
IntentUtils.openUserProfile(getActivity(), userList.account_id, userList.user_id, IntentUtils.openUserProfile(getActivity(), new AccountKey(userList.account_id,
userList.user_screen_name, null, true, null); userList.account_host), userList.user_id, userList.user_screen_name, null,
true, null);
break; break;
} }
} }

View File

@ -29,6 +29,7 @@ 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.SearchQuery; import org.mariotaku.twidere.api.twitter.model.SearchQuery;
import org.mariotaku.twidere.api.twitter.model.Status; import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.util.ParcelableStatusUtils; import org.mariotaku.twidere.model.util.ParcelableStatusUtils;
@ -50,7 +51,8 @@ public class ConversationLoader extends TwitterAPIStatusesLoader {
public ConversationLoader(final Context context, @NonNull final ParcelableStatus status, public ConversationLoader(final Context context, @NonNull final ParcelableStatus status,
final long sinceId, final long maxId, final List<ParcelableStatus> data, final long sinceId, final long maxId, final List<ParcelableStatus> data,
final boolean fromUser) { final boolean fromUser) {
super(context, status.account_id, sinceId, maxId, data, null, -1, fromUser); super(context, new AccountKey(status.account_id, status.account_host), sinceId, maxId, data,
null, -1, fromUser);
mStatus = Nullables.assertNonNull(ParcelUtils.clone(status)); mStatus = Nullables.assertNonNull(ParcelUtils.clone(status));
ParcelableStatusUtils.makeOriginalStatus(mStatus); ParcelableStatusUtils.makeOriginalStatus(mStatus);
} }

View File

@ -22,6 +22,7 @@ package org.mariotaku.twidere.loader.support;
import android.content.Context; import android.content.Context;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import java.util.List; import java.util.List;
@ -34,9 +35,9 @@ import org.mariotaku.twidere.api.twitter.model.User;
public class MutesUsersLoader extends CursorSupportUsersLoader { public class MutesUsersLoader extends CursorSupportUsersLoader {
public MutesUsersLoader(final Context context, final long accountId, final long cursor, public MutesUsersLoader(final Context context, final AccountKey accountKey,
final List<ParcelableUser> data, boolean fromUser) { final List<ParcelableUser> data, boolean fromUser) {
super(context, accountId, data, fromUser); super(context, accountKey, data, fromUser);
} }
@NonNull @NonNull

View File

@ -24,6 +24,7 @@ import android.os.Bundle;
import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.AsyncTaskLoader;
import org.mariotaku.twidere.constant.IntentConstants; import org.mariotaku.twidere.constant.IntentConstants;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableCredentials; import org.mariotaku.twidere.model.ParcelableCredentials;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.SingleResponse; import org.mariotaku.twidere.model.SingleResponse;
@ -41,10 +42,11 @@ 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 long mAccountId, mStatusId; private final AccountKey mAccountId;
private final long mStatusId;
public ParcelableStatusLoader(final Context context, final boolean omitIntentExtra, final Bundle extras, public ParcelableStatusLoader(final Context context, final boolean omitIntentExtra, final Bundle extras,
final long accountId, final long statusId) { final AccountKey accountId, final long statusId) {
super(context); super(context);
mOmitIntentExtra = omitIntentExtra; mOmitIntentExtra = omitIntentExtra;
mExtras = extras; mExtras = extras;
@ -64,7 +66,7 @@ public class ParcelableStatusLoader extends AsyncTaskLoader<SingleResponse<Parce
} }
} }
try { try {
final ParcelableStatus status = findStatus(getContext(), mAccountId, accountHost, mStatusId); final ParcelableStatus status = findStatus(getContext(), mAccountId, mStatusId);
final ParcelableCredentials credentials = DataStoreUtils.getCredentials(getContext(), mAccountId); final ParcelableCredentials credentials = DataStoreUtils.getCredentials(getContext(), mAccountId);
final SingleResponse<ParcelableStatus> response = SingleResponse.getInstance(status); final SingleResponse<ParcelableStatus> response = SingleResponse.getInstance(status);
final Bundle extras = response.getExtras(); final Bundle extras = response.getExtras();

View File

@ -44,9 +44,9 @@ import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.JsonSerializer; import org.mariotaku.twidere.util.JsonSerializer;
import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterAPIFactory;
import org.mariotaku.twidere.util.TwitterWrapper; import org.mariotaku.twidere.util.TwitterWrapper;
import org.mariotaku.twidere.util.Utils;
import static org.mariotaku.twidere.util.ContentValuesCreator.createCachedUser; import static org.mariotaku.twidere.util.ContentValuesCreator.createCachedUser;
import static org.mariotaku.twidere.util.Utils.isMyAccount;
public final class ParcelableUserLoader extends AsyncTaskLoader<SingleResponse<ParcelableUser>> implements Constants { public final class ParcelableUserLoader extends AsyncTaskLoader<SingleResponse<ParcelableUser>> implements Constants {
@ -72,7 +72,8 @@ public final class ParcelableUserLoader extends AsyncTaskLoader<SingleResponse<P
public SingleResponse<ParcelableUser> loadInBackground() { public SingleResponse<ParcelableUser> loadInBackground() {
final Context context = getContext(); final Context context = getContext();
final ContentResolver resolver = context.getContentResolver(); final ContentResolver resolver = context.getContentResolver();
int accountColor = DataStoreUtils.getAccountColor(context, mAccountId); final AccountKey accountKey = mAccountId;
int accountColor = DataStoreUtils.getAccountColor(context, accountKey);
if (!mOmitIntentExtra && mExtras != null) { if (!mOmitIntentExtra && mExtras != null) {
final ParcelableUser user = mExtras.getParcelable(EXTRA_USER); final ParcelableUser user = mExtras.getParcelable(EXTRA_USER);
if (user != null) { if (user != null) {
@ -82,7 +83,7 @@ public final class ParcelableUserLoader extends AsyncTaskLoader<SingleResponse<P
return SingleResponse.getInstance(user); return SingleResponse.getInstance(user);
} }
} }
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, mAccountId, true); final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, accountKey, true);
if (twitter == null) return SingleResponse.getInstance(); if (twitter == null) return SingleResponse.getInstance();
if (mLoadFromCache) { if (mLoadFromCache) {
final Expression where; final Expression where;
@ -101,7 +102,8 @@ public final class ParcelableUserLoader extends AsyncTaskLoader<SingleResponse<P
if (cur.moveToFirst()) { if (cur.moveToFirst()) {
final ParcelableUserCursorIndices indices = new ParcelableUserCursorIndices(cur); final ParcelableUserCursorIndices indices = new ParcelableUserCursorIndices(cur);
final ParcelableUser user = indices.newObject(cur); final ParcelableUser user = indices.newObject(cur);
user.account_id = mAccountId; user.account_id = accountKey.getId();
user.account_host = accountKey.getHost();
user.account_color = accountColor; user.account_color = accountColor;
return SingleResponse.getInstance(user); return SingleResponse.getInstance(user);
} }
@ -115,8 +117,8 @@ public final class ParcelableUserLoader extends AsyncTaskLoader<SingleResponse<P
final ContentValues cachedUserValues = createCachedUser(twitterUser); final ContentValues cachedUserValues = createCachedUser(twitterUser);
final long userId = twitterUser.getId(); final long userId = twitterUser.getId();
resolver.insert(CachedUsers.CONTENT_URI, cachedUserValues); resolver.insert(CachedUsers.CONTENT_URI, cachedUserValues);
final ParcelableUser user = ParcelableUserUtils.fromUser(twitterUser, mAccountId); final ParcelableUser user = ParcelableUserUtils.fromUser(twitterUser, accountKey);
if (isMyAccount(context, userId)) { if (Utils.isMyAccount(context, user.id, user.user_host)) {
final ContentValues accountValues = new ContentValues(); final ContentValues accountValues = new ContentValues();
accountValues.put(Accounts.NAME, user.name); accountValues.put(Accounts.NAME, user.name);
accountValues.put(Accounts.SCREEN_NAME, user.screen_name); accountValues.put(Accounts.SCREEN_NAME, user.screen_name);

View File

@ -29,6 +29,7 @@ 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.AccountKey;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.util.InternalTwitterContentUtils; import org.mariotaku.twidere.util.InternalTwitterContentUtils;
@ -37,10 +38,11 @@ import java.util.List;
public class RetweetsOfMeLoader extends TwitterAPIStatusesLoader { public class RetweetsOfMeLoader extends TwitterAPIStatusesLoader {
public RetweetsOfMeLoader(final Context context, final long accountId, final long sinceId, final long maxId, public RetweetsOfMeLoader(final Context context, final AccountKey accountKey,
final long sinceId, final long 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, accountId, sinceId, maxId, data, savedStatusesArgs, tabPosition, fromUser); super(context, accountKey, sinceId, maxId, data, savedStatusesArgs, tabPosition, fromUser);
} }
@NonNull @NonNull

View File

@ -27,22 +27,24 @@ 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.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.AccountKey;
import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterAPIFactory;
import static org.mariotaku.twidere.TwidereConstants.LOGTAG; import static org.mariotaku.twidere.TwidereConstants.LOGTAG;
public class SavedSearchesLoader extends AsyncTaskLoader<ResponseList<SavedSearch>> { public class SavedSearchesLoader extends AsyncTaskLoader<ResponseList<SavedSearch>> {
private final long mAccountId; private final AccountKey mAccountId;
public SavedSearchesLoader(final Context context, final long account_id) { public SavedSearchesLoader(final Context context, final AccountKey accountKey) {
super(context); super(context);
mAccountId = account_id; mAccountId = accountKey;
} }
@Override @Override
public ResponseList<SavedSearch> loadInBackground() { public ResponseList<SavedSearch> loadInBackground() {
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(getContext(), mAccountId, accountHost, false); final Twitter twitter = TwitterAPIFactory.getTwitterInstance(getContext(), mAccountId,
false);
if (twitter == null) return null; if (twitter == null) return null;
try { try {
return twitter.getSavedSearches(); return twitter.getSavedSearches();

View File

@ -26,6 +26,7 @@ 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;
import org.mariotaku.twidere.api.twitter.model.ScheduledStatus; import org.mariotaku.twidere.api.twitter.model.ScheduledStatus;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.util.TwitterAPIFactory; import org.mariotaku.twidere.util.TwitterAPIFactory;
import java.util.List; import java.util.List;
@ -35,13 +36,13 @@ import java.util.List;
*/ */
public class ScheduledStatusesLoader extends AsyncTaskLoader<List<ScheduledStatus>> { public class ScheduledStatusesLoader extends AsyncTaskLoader<List<ScheduledStatus>> {
private final long mAccountId; private final AccountKey mAccountId;
private final long mSinceId; private final long mSinceId;
private final long mMaxId; private final long mMaxId;
@ScheduledStatus.State @ScheduledStatus.State
private final String[] mStates; private final String[] mStates;
public ScheduledStatusesLoader(Context context, long accountId, long sinceId, long maxId, public ScheduledStatusesLoader(Context context, AccountKey accountId, long sinceId, long maxId,
@ScheduledStatus.State String[] states, List<ScheduledStatus> data) { @ScheduledStatus.State String[] states, List<ScheduledStatus> data) {
super(context); super(context);
mAccountId = accountId; mAccountId = accountId;
@ -53,7 +54,8 @@ public class ScheduledStatusesLoader extends AsyncTaskLoader<List<ScheduledStatu
@Override @Override
public List<ScheduledStatus> loadInBackground() { public List<ScheduledStatus> loadInBackground() {
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(getContext(), mAccountId, accountHost, true); final Twitter twitter = TwitterAPIFactory.getTwitterInstance(getContext(), mAccountId, true);
if (twitter == null) return null;
final Paging paging = new Paging(); final Paging paging = new Paging();
if (mSinceId > 0) { if (mSinceId > 0) {
paging.setSinceId(mSinceId); paging.setSinceId(mSinceId);

View File

@ -26,6 +26,7 @@ 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;
import org.mariotaku.twidere.api.twitter.model.User; import org.mariotaku.twidere.api.twitter.model.User;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import java.util.List; import java.util.List;
@ -35,9 +36,9 @@ public class UserSearchLoader extends TwitterAPIUsersLoader {
private final String mQuery; private final String mQuery;
private final int mPage; private final int mPage;
public UserSearchLoader(final Context context, final long accountId, final String query, final int page, public UserSearchLoader(final Context context, final AccountKey accountKey, final String query,
final List<ParcelableUser> data, boolean fromUser) { final int page, final List<ParcelableUser> data, boolean fromUser) {
super(context, accountId, data, fromUser); super(context, accountKey, data, fromUser);
mQuery = query; mQuery = query;
mPage = page; mPage = page;
} }

View File

@ -8,14 +8,14 @@ import android.support.annotation.Nullable;
*/ */
public class BaseRefreshTaskParam implements RefreshTaskParam { public class BaseRefreshTaskParam implements RefreshTaskParam {
private final AccountKey[] mAccountKeys; private final AccountKey[] accountKeys;
private final long[] maxIds; private final long[] maxIds;
private final long[] sinceIds; private final long[] sinceIds;
@NonNull @NonNull
@Override @Override
public AccountKey[] getAccountKeys() { public AccountKey[] getAccountKeys() {
return mAccountKeys; return accountKeys;
} }
@Nullable @Nullable
@ -30,8 +30,18 @@ public class BaseRefreshTaskParam implements RefreshTaskParam {
return sinceIds; return sinceIds;
} }
@Override
public boolean hasMaxIds() {
return maxIds != null;
}
@Override
public boolean hasSinceIds() {
return sinceIds != null;
}
public BaseRefreshTaskParam(AccountKey[] accountKeys, long[] maxIds, long[] sinceIds) { public BaseRefreshTaskParam(AccountKey[] accountKeys, long[] maxIds, long[] sinceIds) {
this.mAccountKeys = accountKeys; this.accountKeys = accountKeys;
this.maxIds = maxIds; this.maxIds = maxIds;
this.sinceIds = sinceIds; this.sinceIds = sinceIds;
} }

View File

@ -16,4 +16,8 @@ public interface RefreshTaskParam {
@Nullable @Nullable
long[] getSinceIds(); long[] getSinceIds();
boolean hasMaxIds();
boolean hasSinceIds();
} }

View File

@ -18,4 +18,14 @@ public abstract class SimpleRefreshTaskParam implements RefreshTaskParam {
public long[] getSinceIds() { public long[] getSinceIds() {
return null; return null;
} }
@Override
public boolean hasMaxIds() {
return getMaxIds() != null;
}
@Override
public boolean hasSinceIds() {
return getSinceIds() != null;
}
} }

View File

@ -2,6 +2,7 @@ package org.mariotaku.twidere.model.util;
import org.mariotaku.twidere.api.twitter.model.DirectMessage; import org.mariotaku.twidere.api.twitter.model.DirectMessage;
import org.mariotaku.twidere.api.twitter.model.User; import org.mariotaku.twidere.api.twitter.model.User;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableDirectMessage; import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.util.InternalTwitterContentUtils; import org.mariotaku.twidere.util.InternalTwitterContentUtils;
import org.mariotaku.twidere.util.TwitterContentUtils; import org.mariotaku.twidere.util.TwitterContentUtils;
@ -14,9 +15,14 @@ import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText;
* Created by mariotaku on 16/2/13. * Created by mariotaku on 16/2/13.
*/ */
public class ParcelableDirectMessageUtils { public class ParcelableDirectMessageUtils {
public static ParcelableDirectMessage fromDirectMessage(DirectMessage message, long accountId, boolean isOutgoing) { public static ParcelableDirectMessage fromDirectMessage(DirectMessage message, AccountKey accountKey, boolean isOutgoing) {
return fromDirectMessage(message, accountKey.getId(), accountKey.getHost(), isOutgoing);
}
public static ParcelableDirectMessage fromDirectMessage(DirectMessage message, long accountId, String accountHost, boolean isOutgoing) {
ParcelableDirectMessage result = new ParcelableDirectMessage(); ParcelableDirectMessage result = new ParcelableDirectMessage();
result.account_id = accountId; result.account_id = accountId;
result.account_host = accountHost;
result.is_outgoing = isOutgoing; result.is_outgoing = isOutgoing;
final User sender = message.getSender(), recipient = message.getRecipient(); final User sender = message.getSender(), recipient = message.getRecipient();
assert sender != null && recipient != null; assert sender != null && recipient != null;

View File

@ -134,7 +134,7 @@ public class ParcelableMediaUtils {
if ("animated_gif".equals(name) || "player".equals(name)) { if ("animated_gif".equals(name) || "player".equals(name)) {
final ParcelableMedia media = new ParcelableMedia(); final ParcelableMedia media = new ParcelableMedia();
final CardEntity.BindingValue playerStreamUrl = card.getBindingValue("player_stream_url"); final CardEntity.BindingValue playerStreamUrl = card.getBindingValue("player_stream_url");
media.card = ParcelableCardEntityUtils.fromCardEntity(card, -1); media.card = ParcelableCardEntityUtils.fromCardEntity(card, null);
CardEntity.StringValue appUrlResolved = (CardEntity.StringValue) card.getBindingValue("app_url_resolved"); CardEntity.StringValue appUrlResolved = (CardEntity.StringValue) card.getBindingValue("app_url_resolved");
media.url = checkUrl(appUrlResolved) ? appUrlResolved.getValue() : card.getUrl(); media.url = checkUrl(appUrlResolved) ? appUrlResolved.getValue() : card.getUrl();
if ("animated_gif".equals(name)) { if ("animated_gif".equals(name)) {
@ -179,7 +179,7 @@ public class ParcelableMediaUtils {
final ParcelableMedia media = new ParcelableMedia(); final ParcelableMedia media = new ParcelableMedia();
media.url = card.getUrl(); media.url = card.getUrl();
media.card = ParcelableCardEntityUtils.fromCardEntity(card, -1); media.card = ParcelableCardEntityUtils.fromCardEntity(card, null);
media.type = ParcelableMedia.Type.IMAGE; media.type = ParcelableMedia.Type.IMAGE;
media.media_url = ((CardEntity.ImageValue) photoImageFullSize).getUrl(); media.media_url = ((CardEntity.ImageValue) photoImageFullSize).getUrl();
media.width = ((CardEntity.ImageValue) photoImageFullSize).getWidth(); media.width = ((CardEntity.ImageValue) photoImageFullSize).getWidth();

View File

@ -63,6 +63,7 @@ import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.api.twitter.model.StatusUpdate; import org.mariotaku.twidere.api.twitter.model.StatusUpdate;
import org.mariotaku.twidere.api.twitter.model.UserMentionEntity; import org.mariotaku.twidere.api.twitter.model.UserMentionEntity;
import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.Draft; import org.mariotaku.twidere.model.Draft;
import org.mariotaku.twidere.model.DraftCursorIndices; import org.mariotaku.twidere.model.DraftCursorIndices;
import org.mariotaku.twidere.model.DraftValuesCreator; import org.mariotaku.twidere.model.DraftValuesCreator;
@ -288,15 +289,15 @@ public class BackgroundOperationService extends IntentService implements Constan
} }
private void handleSendDirectMessageIntent(final Intent intent) { private void handleSendDirectMessageIntent(final Intent intent) {
final long accountId = intent.getLongExtra(EXTRA_ACCOUNT_ID, -1); final AccountKey accountId = intent.getParcelableExtra(EXTRA_ACCOUNT_KEY);
final long recipientId = intent.getLongExtra(EXTRA_RECIPIENT_ID, -1); final long recipientId = intent.getLongExtra(EXTRA_RECIPIENT_ID, -1);
final String imageUri = intent.getStringExtra(EXTRA_IMAGE_URI); final String imageUri = intent.getStringExtra(EXTRA_IMAGE_URI);
final String text = intent.getStringExtra(EXTRA_TEXT); final String text = intent.getStringExtra(EXTRA_TEXT);
sendMessage(accountId, recipientId, text, imageUri); sendMessage(accountId, recipientId, text, imageUri);
} }
private void sendMessage(long accountId, long recipientId, String text, String imageUri) { private void sendMessage(AccountKey accountId, long recipientId, String text, String imageUri) {
if (accountId <= 0 || recipientId <= 0 || isEmpty(text)) return; if (accountId == null || recipientId <= 0 || isEmpty(text)) return;
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);
@ -376,7 +377,8 @@ public class BackgroundOperationService extends IntentService implements Constan
boolean failed = false; boolean failed = false;
Exception exception = null; Exception exception = null;
final Expression where = Expression.equals(Drafts._ID, draftId); final Expression where = Expression.equals(Drafts._ID, draftId);
final List<Long> failedAccountIds = TwidereListUtils.fromArray(DataStoreUtils.getAccountKeys(item.accounts)); final List<AccountKey> failedAccountIds = new ArrayList<>();
Collections.addAll(failedAccountIds, DataStoreUtils.getAccountKeys(item.accounts));
for (final SingleResponse<ParcelableStatus> response : result) { for (final SingleResponse<ParcelableStatus> response : result) {
final ParcelableStatus data = response.getData(); final ParcelableStatus data = response.getData();
@ -386,11 +388,12 @@ public class BackgroundOperationService extends IntentService implements Constan
exception = response.getException(); exception = response.getException();
} }
} else if (data.account_id > 0) { } else if (data.account_id > 0) {
failedAccountIds.remove(data.account_id); failedAccountIds.remove(new AccountKey(data.account_id, data.account_host));
// BEGIN HotMobi // BEGIN HotMobi
final TweetEvent event = TweetEvent.create(this, data, TimelineType.OTHER); final TweetEvent event = TweetEvent.create(this, data, TimelineType.OTHER);
event.setAction(TweetEvent.Action.TWEET); event.setAction(TweetEvent.Action.TWEET);
HotMobiLogger.getInstance(this).log(data.account_id, event); HotMobiLogger.getInstance(this).log(new AccountKey(data.account_id,
data.account_host), event);
// END HotMobi // END HotMobi
} }
} }
@ -442,10 +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 long accountId, final long recipientId, final AccountKey accountKey, final long recipientId,
final String text, final String imageUri) { final String text, final String imageUri) {
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(this, accountId, true, true); final Twitter twitter = TwitterAPIFactory.getTwitterInstance(this, accountKey, true, true);
final TwitterUpload twitterUpload = TwitterAPIFactory.getTwitterInstance(this, accountId, accountHost, 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();
try { try {
final ParcelableDirectMessage directMessage; final ParcelableDirectMessage directMessage;
@ -462,12 +465,12 @@ public class BackgroundOperationService extends IntentService implements Constan
// final MediaUploadResponse uploadResp = twitter.uploadMedia(file.getName(), is, o.outMimeType); // final MediaUploadResponse uploadResp = twitter.uploadMedia(file.getName(), is, o.outMimeType);
final MediaUploadResponse uploadResp = twitterUpload.uploadMedia(file); final MediaUploadResponse uploadResp = twitterUpload.uploadMedia(file);
directMessage = ParcelableDirectMessageUtils.fromDirectMessage(twitter.sendDirectMessage(recipientId, text, directMessage = ParcelableDirectMessageUtils.fromDirectMessage(twitter.sendDirectMessage(recipientId, text,
uploadResp.getId()), accountId, true); uploadResp.getId()), accountKey, true);
if (!file.delete()) { if (!file.delete()) {
Log.d(LOGTAG, String.format("unable to delete %s", path)); Log.d(LOGTAG, String.format("unable to delete %s", path));
} }
} else { } else {
directMessage = ParcelableDirectMessageUtils.fromDirectMessage(twitter.sendDirectMessage(recipientId, text), accountId, true); directMessage = ParcelableDirectMessageUtils.fromDirectMessage(twitter.sendDirectMessage(recipientId, text), accountKey, true);
} }
Utils.setLastSeen(this, recipientId, System.currentTimeMillis()); Utils.setLastSeen(this, recipientId, System.currentTimeMillis());
@ -581,12 +584,14 @@ public class BackgroundOperationService extends IntentService implements Constan
shortener.waitForService(); shortener.waitForService();
} }
for (final ParcelableAccount account : statusUpdate.accounts) { for (final ParcelableAccount account : statusUpdate.accounts) {
final ParcelableCredentials credentials = DataStoreUtils.getCredentials(this, account.account_id); final AccountKey accountKey = new AccountKey(account.account_id, account.account_host);
final ParcelableCredentials credentials = DataStoreUtils.getCredentials(this,
accountKey);
// Get Twitter instance corresponding to account // Get Twitter instance corresponding to account
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(this, account.account_id, final Twitter twitter = TwitterAPIFactory.getTwitterInstance(this, accountKey,
true, true); true, true);
final TwitterUpload upload = TwitterAPIFactory.getTwitterInstance(this, account.account_id, final TwitterUpload upload = TwitterAPIFactory.getTwitterInstance(this,
accountHost, true, true, TwitterUpload.class); accountKey, true, true, TwitterUpload.class);
// Shouldn't happen // Shouldn't happen
if (twitter == null || upload == null || credentials == null) { if (twitter == null || upload == null || credentials == null) {
@ -621,7 +626,7 @@ public class BackgroundOperationService extends IntentService implements Constan
StatusShortenResult shortenedResult = null; StatusShortenResult shortenedResult = null;
if (shouldShorten && shortener != null) { if (shouldShorten && shortener != null) {
try { try {
shortenedResult = shortener.shorten(statusUpdate, account.account_id, shortenedResult = shortener.shorten(statusUpdate, accountKey.getId(),
statusText); statusText);
} catch (final Exception e) { } catch (final Exception e) {
throw new ShortenException(getString(R.string.error_message_tweet_shorten_failed), e); throw new ShortenException(getString(R.string.error_message_tweet_shorten_failed), e);
@ -701,7 +706,8 @@ public class BackgroundOperationService extends IntentService implements Constan
notReplyToOther = true; notReplyToOther = true;
} }
} }
final ParcelableStatus result = ParcelableStatusUtils.fromStatus(resultStatus, account.account_id, accountHost, false); final ParcelableStatus result = ParcelableStatusUtils.fromStatus(resultStatus,
accountKey, false);
if (shouldShorten && shortener != null && shortenedResult != null) { if (shouldShorten && shortener != null && shortenedResult != null) {
shortener.callback(shortenedResult, result); shortener.callback(shortenedResult, result);
} }

View File

@ -34,6 +34,7 @@ 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.AccountKey;
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;
@ -61,7 +62,7 @@ public class StreamingService extends Service implements Constants {
private NotificationManager mNotificationManager; private NotificationManager mNotificationManager;
private long[] mAccountIds; private AccountKey[] mAccountKeys;
private static final Uri[] MESSAGES_URIS = new Uri[]{DirectMessages.Inbox.CONTENT_URI, private static final Uri[] MESSAGES_URIS = new Uri[]{DirectMessages.Inbox.CONTENT_URI,
DirectMessages.Outbox.CONTENT_URI}; DirectMessages.Outbox.CONTENT_URI};
@ -75,7 +76,7 @@ public class StreamingService extends Service implements Constants {
@Override @Override
public void onChange(final boolean selfChange, final Uri uri) { public void onChange(final boolean selfChange, final Uri uri) {
if (!TwidereArrayUtils.contentMatch(mAccountIds, DataStoreUtils.getActivatedAccountKeys(StreamingService.this))) { if (!TwidereArrayUtils.contentMatch(mAccountKeys, DataStoreUtils.getActivatedAccountKeys(StreamingService.this))) {
initStreaming(); initStreaming();
} }
} }
@ -126,19 +127,20 @@ public class StreamingService extends Service implements Constants {
private boolean setTwitterInstances() { private boolean setTwitterInstances() {
final List<ParcelableCredentials> accountsList = DataStoreUtils.getCredentialsList(this, true); final List<ParcelableCredentials> accountsList = DataStoreUtils.getCredentialsList(this, true);
final long[] accountIds = new long[accountsList.size()]; final AccountKey[] accountKeys = new AccountKey[accountsList.size()];
for (int i = 0, j = accountIds.length; i < j; i++) { for (int i = 0, j = accountKeys.length; i < j; i++) {
accountIds[i] = accountsList.get(i).account_id; final ParcelableCredentials credentials = accountsList.get(i);
accountKeys[i] = new AccountKey(credentials.account_id, credentials.account_host);
} }
final AccountPreferences[] activitedPreferences = AccountPreferences.getAccountPreferences(this, accountIds); final AccountPreferences[] activatedPreferences = AccountPreferences.getAccountPreferences(this, accountKeys);
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
Log.d(Constants.LOGTAG, "Setting up twitter stream instances"); Log.d(Constants.LOGTAG, "Setting up twitter stream instances");
} }
mAccountIds = accountIds; mAccountKeys = accountKeys;
clearTwitterInstances(); clearTwitterInstances();
boolean result = false; boolean result = false;
for (int i = 0, j = accountsList.size(); i < j; i++) { for (int i = 0, j = accountsList.size(); i < j; i++) {
final AccountPreferences preferences = activitedPreferences[i]; final AccountPreferences preferences = activatedPreferences[i];
if (!preferences.isStreamingEnabled()) continue; if (!preferences.isStreamingEnabled()) continue;
final ParcelableCredentials account = accountsList.get(i); final ParcelableCredentials account = accountsList.get(i);
final Endpoint endpoint = TwitterAPIFactory.getEndpoint(account, TwitterUserStream.class); final Endpoint endpoint = TwitterAPIFactory.getEndpoint(account, TwitterUserStream.class);
@ -246,14 +248,14 @@ public class StreamingService extends Service implements Constants {
final User sender = directMessage.getSender(), recipient = directMessage.getRecipient(); final User sender = directMessage.getSender(), recipient = directMessage.getRecipient();
if (sender.getId() == account.account_id) { if (sender.getId() == account.account_id) {
final ContentValues values = ContentValuesCreator.createDirectMessage(directMessage, final ContentValues values = ContentValuesCreator.createDirectMessage(directMessage,
account.account_id, true); account.account_id, account.account_host, 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_id) { if (recipient.getId() == account.account_id) {
final ContentValues values = ContentValuesCreator.createDirectMessage(directMessage, final ContentValues values = ContentValuesCreator.createDirectMessage(directMessage,
account.account_id, false); account.account_id, account.account_host, false);
final Uri.Builder builder = DirectMessages.Inbox.CONTENT_URI.buildUpon(); final Uri.Builder builder = DirectMessages.Inbox.CONTENT_URI.buildUpon();
builder.appendQueryParameter(QUERY_PARAM_NOTIFY, "true"); builder.appendQueryParameter(QUERY_PARAM_NOTIFY, "true");
if (values != null) { if (values != null) {
@ -332,8 +334,8 @@ public class StreamingService extends Service implements Constants {
@Override @Override
public void onStatus(final Status status) { public void onStatus(final Status status) {
final ContentValues values = ContentValuesCreator.createStatus(status, account.account_id, final ContentValues values = ContentValuesCreator.createStatus(status,
account.account_host); new AccountKey(account.account_id, account.account_host));
if (!statusStreamStarted) { if (!statusStreamStarted) {
statusStreamStarted = true; statusStreamStarted = true;
values.put(Statuses.IS_GAP, true); values.put(Statuses.IS_GAP, true);

View File

@ -66,8 +66,7 @@ public class CacheUsersStatusesTask extends AbstractTask<TwitterListResponse<Sta
final Set<ContentValues> hashTagValues = new HashSet<>(); final Set<ContentValues> hashTagValues = new HashSet<>();
final AccountKey accountKey = params.mAccountKey; final AccountKey accountKey = params.mAccountKey;
statusesValues.add(ContentValuesCreator.createStatus(status, accountKey.getId(), statusesValues.add(ContentValuesCreator.createStatus(status, accountKey));
accountKey.getHost()));
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)) {
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();

View File

@ -35,8 +35,7 @@ public class GetSavedSearchesTask extends AbstractTask<AccountKey[], SingleRespo
public SingleResponse<Object> doLongOperation(AccountKey[] params) { public SingleResponse<Object> doLongOperation(AccountKey[] params) {
final ContentResolver cr = mContext.getContentResolver(); final ContentResolver cr = mContext.getContentResolver();
for (AccountKey accountKey : params) { for (AccountKey accountKey : params) {
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, accountKey.getId(), final Twitter twitter = TwitterAPIFactory.getTwitterInstance(mContext, accountKey, true);
accountKey.getHost(), true);
if (twitter == null) continue; if (twitter == null) continue;
try { try {
final ResponseList<SavedSearch> searches = twitter.getSavedSearches(); final ResponseList<SavedSearch> searches = twitter.getSavedSearches();

View File

@ -78,15 +78,14 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
@NonNull @NonNull
protected abstract Uri getContentUri(); protected abstract Uri getContentUri();
private void storeStatus(final long accountId, final String accountHost, private void storeStatus(final AccountKey accountKey, final List<Status> statuses,
final List<Status> statuses,
final long sinceId, final long maxId, final boolean notify) { final long sinceId, final long maxId, final boolean notify) {
if (statuses == null || statuses.isEmpty() || accountId <= 0) { if (statuses == null || statuses.isEmpty() || accountKey == null) {
return; return;
} }
final Uri uri = getContentUri(); final Uri uri = getContentUri();
final ContentResolver resolver = context.getContentResolver(); final ContentResolver resolver = context.getContentResolver();
final boolean noItemsBefore = DataStoreUtils.getStatusCount(context, uri, accountId) <= 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 long[] statusIds = new long[statuses.size()];
long minId = -1; long minId = -1;
@ -94,7 +93,7 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
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, accountId, accountHost); 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 long id = status.getId();
if (sinceId > 0 && id <= sinceId) { if (sinceId > 0 && id <= sinceId) {
@ -107,13 +106,14 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
statusIds[i] = id; statusIds[i] = id;
} }
// Delete all rows conflicting before new data inserted. // Delete all rows conflicting before new data inserted.
final Expression accountWhere = Expression.equals(Statuses.ACCOUNT_ID, accountId); final Expression accountWhere = Utils.getAccountCompareExpression();
final Expression statusWhere = Expression.in(new Columns.Column(Statuses.STATUS_ID), final Expression statusWhere = Expression.in(new Columns.Column(Statuses.STATUS_ID),
new RawItemArray(statusIds)); new RawItemArray(statusIds));
final String countWhere = Expression.and(accountWhere, statusWhere).getSQL(); final String countWhere = Expression.and(accountWhere, statusWhere).getSQL();
String[] whereArgs = {String.valueOf(accountKey.getId()), accountKey.getHost()};
final String[] projection = {SQLFunctions.COUNT()}; final String[] projection = {SQLFunctions.COUNT()};
final int rowsDeleted; final int rowsDeleted;
final Cursor countCur = resolver.query(uri, projection, countWhere, null, null); final Cursor countCur = resolver.query(uri, projection, countWhere, whereArgs, null);
try { try {
if (countCur != null && countCur.moveToFirst()) { if (countCur != null && countCur.moveToFirst()) {
rowsDeleted = countCur.getInt(0); rowsDeleted = countCur.getInt(0);
@ -126,7 +126,7 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
// BEGIN HotMobi // BEGIN HotMobi
final RefreshEvent event = RefreshEvent.create(context, statusIds, getTimelineType()); final RefreshEvent event = RefreshEvent.create(context, statusIds, getTimelineType());
HotMobiLogger.getInstance(context).log(accountId, event); HotMobiLogger.getInstance(context).log(accountKey, event);
// END HotMobi // END HotMobi
// Insert a gap. // Insert a gap.
@ -166,8 +166,7 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
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);
for (final AccountKey accountKey : accountKeys) { for (final AccountKey accountKey : accountKeys) {
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, accountKey.getId(), final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, accountKey, true);
accountKey.getHost(), true);
if (twitter == null) continue; if (twitter == null) continue;
try { try {
final Paging paging = new Paging(); final Paging paging = new Paging();
@ -190,7 +189,7 @@ public abstract class GetStatusesTask extends AbstractTask<RefreshTaskParam,
} }
final List<Status> statuses = getStatuses(twitter, paging); final List<Status> statuses = getStatuses(twitter, paging);
InternalTwitterContentUtils.getStatusesWithQuoteData(twitter, statuses); InternalTwitterContentUtils.getStatusesWithQuoteData(twitter, statuses);
storeStatus(accountKey.getId(), accountKey.getHost(), statuses, sinceId, maxId, true); storeStatus(accountKey, statuses, sinceId, maxId, true);
// TODO cache related data and preload // TODO cache related data and preload
final CacheUsersStatusesTask cacheTask = new CacheUsersStatusesTask(context); final CacheUsersStatusesTask cacheTask = new CacheUsersStatusesTask(context);
cacheTask.setParams(new TwitterWrapper.StatusListResponse(accountKey, statuses)); cacheTask.setParams(new TwitterWrapper.StatusListResponse(accountKey, statuses));

View File

@ -25,25 +25,26 @@ import android.text.style.URLSpan;
import android.view.View; import android.view.View;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener; import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener;
public class TwidereURLSpan extends URLSpan implements Constants { public class TwidereURLSpan extends URLSpan implements Constants {
private final int type, highlightStyle; private final int type, highlightStyle;
private final long accountId; private final AccountKey accountKey;
private final long extraId; private final long extraId;
private final String url, orig; private final String url, orig;
private final boolean sensitive; private final boolean sensitive;
private final OnLinkClickListener listener; private final OnLinkClickListener listener;
private final int start, end; private final int start, end;
public TwidereURLSpan(final String url, final String orig, final long accountId, final long extraId, public TwidereURLSpan(final String url, final String orig, final AccountKey accountKey, final long extraId,
final int type, final boolean sensitive, final int highlightStyle, int start, int end, final int type, final boolean sensitive, final int highlightStyle, int start, int end,
final OnLinkClickListener listener) { final OnLinkClickListener listener) {
super(url); super(url);
this.url = url; this.url = url;
this.orig = orig; this.orig = orig;
this.accountId = accountId; this.accountKey = accountKey;
this.extraId = extraId; this.extraId = extraId;
this.type = type; this.type = type;
this.sensitive = sensitive; this.sensitive = sensitive;
@ -56,7 +57,7 @@ public class TwidereURLSpan extends URLSpan implements Constants {
@Override @Override
public void onClick(@NonNull final View widget) { public void onClick(@NonNull final View widget) {
if (listener != null) { if (listener != null) {
listener.onLinkClick(url, orig, accountId, extraId, type, sensitive, start, end); listener.onLinkClick(url, orig, accountKey, extraId, type, sensitive, start, end);
} }
} }

View File

@ -222,12 +222,13 @@ public final class ContentValuesCreator implements TwidereConstants {
return values; return values;
} }
public static ContentValues createMessageDraft(final long accountId, final long recipientId, public static ContentValues createMessageDraft(final AccountKey accountKey, final long 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[]{accountId}, ',', false)); values.put(Drafts.ACCOUNT_IDS, TwidereArrayUtils.toString(new long[]{accountKey.getId()},
',', 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)};

View File

@ -241,9 +241,10 @@ public class DataStoreUtils implements Constants {
Activities.MAX_POSITION, new OrderBy(SQLFunctions.MIN(Activities.TIMESTAMP))); Activities.MAX_POSITION, new OrderBy(SQLFunctions.MIN(Activities.TIMESTAMP)));
} }
public static int getStatusCount(final Context context, final Uri uri, final long accountId) { public static int getStatusCount(final Context context, final Uri uri, final AccountKey accountId) {
final String where = Expression.equals(Statuses.ACCOUNT_ID, accountId).getSQL(); final String where = Utils.getAccountCompareExpression().getSQL();
return queryCount(context, uri, where, null); final String[] whereArgs = {String.valueOf(accountId.getId()), accountId.getHost()};
return queryCount(context, uri, where, whereArgs);
} }
public static int getActivitiesCount(final Context context, final Uri uri, final AccountKey accountKey) { public static int getActivitiesCount(final Context context, final Uri uri, final AccountKey accountKey) {

View File

@ -79,11 +79,11 @@ public class IntentUtils implements Constants {
} }
} }
public static void openUserProfile(final Context context, final long accountId, final long userId, public static void openUserProfile(final Context context, @Nullable final AccountKey accountId,
final String screenName, final Bundle activityOptions, final long userId, final String screenName,
final boolean newDocument, final Bundle activityOptions, final boolean newDocument,
@UserFragment.Referral final String referral) { @UserFragment.Referral final String referral) {
if (context == null || accountId <= 0 || userId <= 0 && isEmpty(screenName)) return; if (context == null || userId <= 0 && isEmpty(screenName)) return;
final Uri uri = LinkCreator.getTwidereUserLink(accountId, userId, screenName); final Uri uri = LinkCreator.getTwidereUserLink(accountId, userId, screenName);
final Intent intent = new Intent(Intent.ACTION_VIEW, uri); final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(EXTRA_REFERRAL, referral); intent.putExtra(EXTRA_REFERRAL, referral);

View File

@ -20,9 +20,11 @@
package org.mariotaku.twidere.util; package org.mariotaku.twidere.util;
import android.net.Uri; import android.net.Uri;
import android.support.annotation.Nullable;
import android.text.TextUtils; import android.text.TextUtils;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
/** /**
@ -42,23 +44,23 @@ public class LinkCreator implements Constants {
return builder.build(); return builder.build();
} }
public static Uri getTwidereStatusLink(long accountId, long statusId) { public static Uri getTwidereStatusLink(AccountKey accountKey, long statusId) {
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_STATUS); builder.authority(AUTHORITY_STATUS);
if (accountId > 0) { if (accountKey != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_ID, String.valueOf(accountId)); builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString());
} }
builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, String.valueOf(statusId)); builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, String.valueOf(statusId));
return builder.build(); return builder.build();
} }
public static Uri getTwidereUserLink(long accountId, long userId, String screenName) { public static Uri getTwidereUserLink(@Nullable AccountKey accountId, long userId, 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); builder.authority(AUTHORITY_USER);
if (accountId > 0) { if (accountId != null) {
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_ID, String.valueOf(accountId)); builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountId.toString());
} }
if (userId > 0) { if (userId > 0) {
builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(userId)); builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(userId));

View File

@ -33,6 +33,7 @@ import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener; import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableAccount; import org.mariotaku.twidere.model.ParcelableAccount;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
@ -109,16 +110,17 @@ public class MediaLoaderWrapper implements Constants {
mImageLoader.displayImage(url, view, mImageDisplayOptions, loadingHandler, loadingHandler); mImageLoader.displayImage(url, view, mImageDisplayOptions, loadingHandler, loadingHandler);
} }
public void displayPreviewImageWithCredentials(final ImageView view, final String url, final long accountId, public void displayPreviewImageWithCredentials(final ImageView view, final String url,
final AccountKey accountKey,
final MediaLoadingHandler loadingHandler) { final MediaLoadingHandler loadingHandler) {
if (accountId <= 0) { if (accountKey == null) {
displayPreviewImage(view, url, loadingHandler); displayPreviewImage(view, url, loadingHandler);
return; return;
} }
final DisplayImageOptions.Builder b = new DisplayImageOptions.Builder(); final DisplayImageOptions.Builder b = new DisplayImageOptions.Builder();
b.cloneFrom(mImageDisplayOptions); b.cloneFrom(mImageDisplayOptions);
MediaExtra extra = new MediaExtra(); MediaExtra extra = new MediaExtra();
extra.setAccountId(accountId); extra.setAccountKey(accountKey);
b.extraForDownloader(extra); b.extraForDownloader(extra);
mImageLoader.displayImage(url, view, b.build(), loadingHandler, loadingHandler); mImageLoader.displayImage(url, view, b.build(), loadingHandler, loadingHandler);
} }

View File

@ -29,6 +29,7 @@ import android.support.annotation.Nullable;
import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.math.NumberUtils;
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.AccountKey;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
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;
@ -50,30 +51,30 @@ public class OnLinkClickHandler implements OnLinkClickListener, Constants {
} }
@Override @Override
public void onLinkClick(final String link, final String orig, final long accountId, public void onLinkClick(final String link, final String orig, final AccountKey accountKey,
final long extraId, final int type, final boolean sensitive, final long extraId, final int type, final boolean sensitive,
final int start, final int end) { final int start, final int end) {
if (manager != null && manager.isActive()) return; if (manager != null && manager.isActive()) return;
if (!isPrivateData()) { if (!isPrivateData()) {
// BEGIN HotMobi // BEGIN HotMobi
final LinkEvent event = LinkEvent.create(context, link, type); final LinkEvent event = LinkEvent.create(context, link, type);
HotMobiLogger.getInstance(context).log(accountId, event); HotMobiLogger.getInstance(context).log(accountKey, event);
// END HotMobi // END HotMobi
} }
switch (type) { switch (type) {
case TwidereLinkify.LINK_TYPE_MENTION: { case TwidereLinkify.LINK_TYPE_MENTION: {
IntentUtils.openUserProfile(context, accountId, -1, link, null, true, IntentUtils.openUserProfile(context, accountKey, -1, link, null, true,
UserFragment.Referral.USER_MENTION); UserFragment.Referral.USER_MENTION);
break; break;
} }
case TwidereLinkify.LINK_TYPE_HASHTAG: { case TwidereLinkify.LINK_TYPE_HASHTAG: {
Utils.openTweetSearch(context, accountId, "#" + link); Utils.openTweetSearch(context, accountKey, "#" + link);
break; break;
} }
case TwidereLinkify.LINK_TYPE_ENTITY_URL: { case TwidereLinkify.LINK_TYPE_ENTITY_URL: {
if (PreviewMediaExtractor.isSupported(link)) { if (PreviewMediaExtractor.isSupported(link)) {
openMedia(accountId, extraId, sensitive, link, start, end); openMedia(accountKey, extraId, sensitive, link, start, end);
} else { } else {
openLink(link); openLink(link);
} }
@ -84,20 +85,20 @@ public class OnLinkClickHandler implements OnLinkClickListener, Constants {
if (mentionList.length != 2) { if (mentionList.length != 2) {
break; break;
} }
Utils.openUserListDetails(context, accountId, -1, -1, mentionList[0], mentionList[1]); Utils.openUserListDetails(context, accountKey, -1, -1, mentionList[0], mentionList[1]);
break; break;
} }
case TwidereLinkify.LINK_TYPE_CASHTAG: { case TwidereLinkify.LINK_TYPE_CASHTAG: {
Utils.openTweetSearch(context, accountId, link); Utils.openTweetSearch(context, accountKey, link);
break; break;
} }
case TwidereLinkify.LINK_TYPE_USER_ID: { case TwidereLinkify.LINK_TYPE_USER_ID: {
IntentUtils.openUserProfile(context, accountId, NumberUtils.toLong(link, -1), null, IntentUtils.openUserProfile(context, accountKey, NumberUtils.toLong(link, -1), null,
null, true, UserFragment.Referral.USER_MENTION); null, true, UserFragment.Referral.USER_MENTION);
break; break;
} }
case TwidereLinkify.LINK_TYPE_STATUS: { case TwidereLinkify.LINK_TYPE_STATUS: {
Utils.openStatus(context, accountId, NumberUtils.toLong(link, -1)); Utils.openStatus(context, accountKey, NumberUtils.toLong(link, -1));
break; break;
} }
} }
@ -107,9 +108,9 @@ public class OnLinkClickHandler implements OnLinkClickListener, Constants {
return false; return false;
} }
protected void openMedia(long accountId, long extraId, boolean sensitive, String link, int start, int end) { protected void openMedia(AccountKey accountKey, long extraId, boolean sensitive, String link, int start, int end) {
final ParcelableMedia[] media = {ParcelableMediaUtils.image(link)}; final ParcelableMedia[] media = {ParcelableMediaUtils.image(link)};
IntentUtils.openMedia(context, accountId, sensitive, null, media, null, true); IntentUtils.openMedia(context, accountKey, sensitive, null, media, null, true);
} }
protected void openLink(final String link) { protected void openLink(final String link) {

View File

@ -21,6 +21,7 @@ package org.mariotaku.twidere.util;
import android.content.Context; import android.content.Context;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
@ -32,7 +33,8 @@ public class StatusLinkClickHandler extends OnLinkClickHandler {
private ParcelableStatus mStatus; private ParcelableStatus mStatus;
@Override @Override
protected void openMedia(long accountId, long extraId, boolean sensitive, String link, int start, int end) { protected void openMedia(final AccountKey accountId, final long extraId, final boolean sensitive,
final String link, final int start, final int end) {
final ParcelableStatus status = mStatus; final ParcelableStatus status = mStatus;
final ParcelableMedia current = findByLink(status.media, link); final ParcelableMedia current = findByLink(status.media, link);
if (current.open_browser) { if (current.open_browser) {

View File

@ -31,6 +31,7 @@ import com.twitter.Extractor.Entity;
import com.twitter.Regex; import com.twitter.Regex;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.text.TwidereURLSpan; import org.mariotaku.twidere.text.TwidereURLSpan;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
@ -61,6 +62,7 @@ public final class TwidereLinkify implements Constants {
public static final int LINK_TYPE_MENTION = 1; public static final int LINK_TYPE_MENTION = 1;
public static final int LINK_TYPE_HASHTAG = 2; public static final int LINK_TYPE_HASHTAG = 2;
public static final int LINK_TYPE_BANGTAG = 3;
public static final int LINK_TYPE_ENTITY_URL = 4; public static final int LINK_TYPE_ENTITY_URL = 4;
public static final int LINK_TYPE_LINK_IN_TEXT = 5; public static final int LINK_TYPE_LINK_IN_TEXT = 5;
public static final int LINK_TYPE_LIST = 6; public static final int LINK_TYPE_LIST = 6;
@ -108,47 +110,47 @@ public final class TwidereLinkify implements Constants {
setHighlightOption(highlightOption); setHighlightOption(highlightOption);
} }
public SpannableString applyAllLinks(@Nullable CharSequence text, final long accountId, public SpannableString applyAllLinks(@Nullable CharSequence text, final AccountKey accountKey,
final long extraId, final boolean sensitive, final long extraId, final boolean sensitive,
final boolean skipLinksInText) { final boolean skipLinksInText) {
return applyAllLinks(text, mOnLinkClickListener, accountId, extraId, sensitive, return applyAllLinks(text, mOnLinkClickListener, accountKey, extraId, sensitive,
mHighlightOption, skipLinksInText); mHighlightOption, skipLinksInText);
} }
public SpannableString applyAllLinks(@Nullable CharSequence text, final long accountId, public SpannableString applyAllLinks(@Nullable CharSequence text, final AccountKey accountKey,
final boolean sensitive, final boolean skipLinksInText) { final boolean sensitive, final boolean skipLinksInText) {
return applyAllLinks(text, mOnLinkClickListener, accountId, -1, sensitive, mHighlightOption, skipLinksInText); return applyAllLinks(text, mOnLinkClickListener, accountKey, -1, sensitive, mHighlightOption, skipLinksInText);
} }
public SpannableString applyAllLinks(@Nullable CharSequence text, final long accountId, public SpannableString applyAllLinks(@Nullable CharSequence text, final AccountKey accountKey,
final long extraId, final boolean sensitive, final long extraId, final boolean sensitive,
final int highlightOption, final boolean skipLinksInText) { final int highlightOption, final boolean skipLinksInText) {
return applyAllLinks(text, mOnLinkClickListener, accountId, extraId, sensitive, highlightOption, skipLinksInText); return applyAllLinks(text, mOnLinkClickListener, accountKey, extraId, sensitive, highlightOption, skipLinksInText);
} }
public SpannableString applyAllLinks(@Nullable final CharSequence text, final OnLinkClickListener listener, public SpannableString applyAllLinks(@Nullable final CharSequence text, final OnLinkClickListener listener,
final long accountId, final long extraId, final boolean sensitive, final AccountKey accountKey, final long extraId, final boolean sensitive,
final int highlightOption, boolean skipLinksInText) { final int highlightOption, boolean skipLinksInText) {
if (text == null) return null; if (text == null) return null;
final SpannableString string = SpannableString.valueOf(text); final SpannableString string = SpannableString.valueOf(text);
for (final int type : ALL_LINK_TYPES) { for (final int type : ALL_LINK_TYPES) {
if (type == LINK_TYPE_LINK_IN_TEXT && skipLinksInText) continue; if (type == LINK_TYPE_LINK_IN_TEXT && skipLinksInText) continue;
addLinks(string, accountId, extraId, type, sensitive, listener, highlightOption); addLinks(string, accountKey, extraId, type, sensitive, listener, highlightOption);
} }
return string; return string;
} }
public SpannableString applyUserProfileLink(final CharSequence text, final long accountId, final long extraId, public SpannableString applyUserProfileLink(final CharSequence text, final AccountKey accountKey, final long extraId,
final long userId, final String screenName) { final long userId, final String screenName) {
return applyUserProfileLink(text, accountId, extraId, userId, screenName, mHighlightOption); return applyUserProfileLink(text, accountKey, extraId, userId, screenName, mHighlightOption);
} }
public SpannableString applyUserProfileLink(final CharSequence text, final long accountId, final long extraId, public SpannableString applyUserProfileLink(final CharSequence text, final AccountKey accountKey, final long extraId,
final long userId, final String screenName, final int highlightOption) { final long userId, final String screenName, final int highlightOption) {
return applyUserProfileLink(text, accountId, extraId, userId, screenName, highlightOption, mOnLinkClickListener); return applyUserProfileLink(text, accountKey, extraId, userId, screenName, highlightOption, mOnLinkClickListener);
} }
public final SpannableString applyUserProfileLink(final CharSequence text, final long accountId, public final SpannableString applyUserProfileLink(final CharSequence text, final AccountKey accountKey,
final long extraId, final long userId, final long extraId, final long userId,
final String screenName, final int highlightOption, final String screenName, final int highlightOption,
final OnLinkClickListener listener) { final OnLinkClickListener listener) {
@ -158,10 +160,10 @@ public final class TwidereLinkify implements Constants {
string.removeSpan(span); string.removeSpan(span);
} }
if (userId > 0) { if (userId > 0) {
applyLink(String.valueOf(userId), 0, string.length(), string, accountId, extraId, applyLink(String.valueOf(userId), 0, string.length(), string, accountKey, extraId,
LINK_TYPE_USER_ID, false, highlightOption, listener); LINK_TYPE_USER_ID, false, highlightOption, listener);
} else if (screenName != null) { } else if (screenName != null) {
applyLink(screenName, 0, string.length(), string, accountId, extraId, applyLink(screenName, 0, string.length(), string, accountKey, extraId,
LINK_TYPE_MENTION, false, highlightOption, listener); LINK_TYPE_MENTION, false, highlightOption, listener);
} }
return string; return string;
@ -171,20 +173,20 @@ public final class TwidereLinkify implements Constants {
mHighlightOption = style; mHighlightOption = style;
} }
private boolean addCashtagLinks(final Spannable spannable, final long accountId, final long extraId, private boolean addCashtagLinks(final Spannable spannable, final AccountKey accountKey, final long extraId,
final OnLinkClickListener listener, final int highlightOption) { final OnLinkClickListener listener, final int highlightOption) {
boolean hasMatches = false; boolean hasMatches = false;
for (final Entity entity : mExtractor.extractCashtagsWithIndices(spannable.toString())) { for (final Entity entity : mExtractor.extractCashtagsWithIndices(spannable.toString())) {
final int start = entity.getStart(); final int start = entity.getStart();
final int end = entity.getEnd(); final int end = entity.getEnd();
applyLink(entity.getValue(), start, end, spannable, accountId, extraId, LINK_TYPE_CASHTAG, applyLink(entity.getValue(), start, end, spannable, accountKey, extraId, LINK_TYPE_CASHTAG,
false, highlightOption, listener); false, highlightOption, listener);
hasMatches = true; hasMatches = true;
} }
return hasMatches; return hasMatches;
} }
private boolean addHashtagLinks(final Spannable spannable, final long accountId, final long extraId, private boolean addHashtagLinks(final Spannable spannable, final AccountKey accountId, final long extraId,
final OnLinkClickListener listener, final int highlightOption) { final OnLinkClickListener listener, final int highlightOption) {
boolean hasMatches = false; boolean hasMatches = false;
for (final Entity entity : mExtractor.extractHashtagsWithIndices(spannable.toString())) { for (final Entity entity : mExtractor.extractHashtagsWithIndices(spannable.toString())) {
@ -200,15 +202,15 @@ public final class TwidereLinkify implements Constants {
/** /**
* Applies a regex to the text of a TextView turning the matches into links. * Applies a regex to the text of a TextView turning the matches into links.
*/ */
private void addLinks(final SpannableString string, final long accountId, final long extraId, final int type, private void addLinks(final SpannableString string, final AccountKey accountKey, final long extraId, final int type,
final boolean sensitive, final OnLinkClickListener listener, final int highlightOption) { final boolean sensitive, final OnLinkClickListener listener, final int highlightOption) {
switch (type) { switch (type) {
case LINK_TYPE_MENTION: { case LINK_TYPE_MENTION: {
addMentionOrListLinks(string, accountId, extraId, highlightOption, listener); addMentionOrListLinks(string, accountKey, extraId, highlightOption, listener);
break; break;
} }
case LINK_TYPE_HASHTAG: { case LINK_TYPE_HASHTAG: {
addHashtagLinks(string, accountId, extraId, listener, highlightOption); addHashtagLinks(string, accountKey, extraId, listener, highlightOption);
break; break;
} }
case LINK_TYPE_ENTITY_URL: { case LINK_TYPE_ENTITY_URL: {
@ -220,7 +222,7 @@ public final class TwidereLinkify implements Constants {
continue; continue;
} }
string.removeSpan(span); string.removeSpan(span);
applyLink(span.getURL(), start, end, string, accountId, extraId, LINK_TYPE_ENTITY_URL, sensitive, highlightOption, listener); applyLink(span.getURL(), start, end, string, accountKey, extraId, LINK_TYPE_ENTITY_URL, sensitive, highlightOption, listener);
} }
break; break;
} }
@ -232,7 +234,7 @@ public final class TwidereLinkify implements Constants {
|| string.getSpans(start, end, URLSpan.class).length > 0) { || string.getSpans(start, end, URLSpan.class).length > 0) {
continue; continue;
} }
applyLink(entity.getValue(), start, end, string, accountId, extraId, LINK_TYPE_ENTITY_URL, sensitive, highlightOption, listener); applyLink(entity.getValue(), start, end, string, accountKey, extraId, LINK_TYPE_ENTITY_URL, sensitive, highlightOption, listener);
} }
break; break;
} }
@ -245,19 +247,19 @@ public final class TwidereLinkify implements Constants {
final int end = string.getSpanEnd(span); final int end = string.getSpanEnd(span);
final String url = matcherGroup(matcher, GROUP_ID_TWITTER_STATUS_STATUS_ID); final String url = matcherGroup(matcher, GROUP_ID_TWITTER_STATUS_STATUS_ID);
string.removeSpan(span); string.removeSpan(span);
applyLink(url, start, end, string, accountId, extraId, LINK_TYPE_STATUS, sensitive, highlightOption, listener); applyLink(url, start, end, string, accountKey, extraId, LINK_TYPE_STATUS, sensitive, highlightOption, listener);
} }
} }
break; break;
} }
case LINK_TYPE_CASHTAG: { case LINK_TYPE_CASHTAG: {
addCashtagLinks(string, accountId, extraId, listener, highlightOption); addCashtagLinks(string, accountKey, extraId, listener, highlightOption);
break; break;
} }
} }
} }
private boolean addMentionOrListLinks(final Spannable spannable, final long accountId, private boolean addMentionOrListLinks(final Spannable spannable, final AccountKey accountKey,
final long extraId, final int highlightOption, final OnLinkClickListener listener) { final long extraId, final int highlightOption, final OnLinkClickListener listener) {
boolean hasMatches = false; boolean hasMatches = false;
// Extract lists from status text // Extract lists from status text
@ -269,11 +271,11 @@ public final class TwidereLinkify implements Constants {
final int listEnd = matcherEnd(matcher, Regex.VALID_MENTION_OR_LIST_GROUP_LIST); final int listEnd = matcherEnd(matcher, Regex.VALID_MENTION_OR_LIST_GROUP_LIST);
final String username = matcherGroup(matcher, Regex.VALID_MENTION_OR_LIST_GROUP_USERNAME); final String username = matcherGroup(matcher, Regex.VALID_MENTION_OR_LIST_GROUP_USERNAME);
final String list = matcherGroup(matcher, Regex.VALID_MENTION_OR_LIST_GROUP_LIST); final String list = matcherGroup(matcher, Regex.VALID_MENTION_OR_LIST_GROUP_LIST);
applyLink(username, start, username_end, spannable, accountId, extraId, LINK_TYPE_MENTION, applyLink(username, start, username_end, spannable, accountKey, extraId, LINK_TYPE_MENTION,
false, highlightOption, listener); false, highlightOption, listener);
if (listStart >= 0 && listEnd >= 0 && list != null) { if (listStart >= 0 && listEnd >= 0 && list != null) {
applyLink(String.format("%s/%s", username, list.substring(list.startsWith("/") ? 1 : 0)), listStart, applyLink(String.format("%s/%s", username, list.substring(list.startsWith("/") ? 1 : 0)), listStart,
listEnd, spannable, accountId, extraId, LINK_TYPE_LIST, false, highlightOption, listener); listEnd, spannable, accountKey, extraId, LINK_TYPE_LIST, false, highlightOption, listener);
} }
hasMatches = true; hasMatches = true;
} }
@ -287,7 +289,7 @@ public final class TwidereLinkify implements Constants {
final String screenName = matcherGroup(m, GROUP_ID_TWITTER_LIST_SCREEN_NAME); final String screenName = matcherGroup(m, GROUP_ID_TWITTER_LIST_SCREEN_NAME);
final String listName = matcherGroup(m, GROUP_ID_TWITTER_LIST_LIST_NAME); final String listName = matcherGroup(m, GROUP_ID_TWITTER_LIST_LIST_NAME);
spannable.removeSpan(span); spannable.removeSpan(span);
applyLink(screenName + "/" + listName, start, end, spannable, accountId, extraId, applyLink(screenName + "/" + listName, start, end, spannable, accountKey, extraId,
LINK_TYPE_LIST, false, highlightOption, listener); LINK_TYPE_LIST, false, highlightOption, listener);
hasMatches = true; hasMatches = true;
} }
@ -296,17 +298,17 @@ public final class TwidereLinkify implements Constants {
} }
private void applyLink(final String url, final String orig, final int start, final int end, private void applyLink(final String url, final String orig, final int start, final int end,
final Spannable text, final long accountId, final long extraId, final int type, final boolean sensitive, final Spannable text, final AccountKey accountKey, final long extraId, final int type, final boolean sensitive,
final int highlightOption, final OnLinkClickListener listener) { final int highlightOption, final OnLinkClickListener listener) {
final TwidereURLSpan span = new TwidereURLSpan(url, orig, accountId, extraId, type, sensitive, final TwidereURLSpan span = new TwidereURLSpan(url, orig, accountKey, extraId, type, sensitive,
highlightOption, start, end, listener); highlightOption, start, end, listener);
text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} }
private void applyLink(final String url, final int start, final int end, final Spannable text, private void applyLink(final String url, final int start, final int end, final Spannable text,
final long accountId, final long extraId, final int type, final boolean sensitive, final AccountKey accountKey, final long extraId, final int type, final boolean sensitive,
final int highlightOption, final OnLinkClickListener listener) { final int highlightOption, final OnLinkClickListener listener) {
applyLink(url, null, start, end, text, accountId, extraId, type, sensitive, highlightOption, applyLink(url, null, start, end, text, accountKey, extraId, type, sensitive, highlightOption,
listener); listener);
} }
@ -318,7 +320,7 @@ public final class TwidereLinkify implements Constants {
} }
public interface OnLinkClickListener { public interface OnLinkClickListener {
void onLinkClick(String link, String orig, long accountId, long extraId, int type, void onLinkClick(String link, String orig, AccountKey accountKey, long extraId, int type,
boolean sensitive, int start, int end); boolean sensitive, int start, int end);
} }
} }

View File

@ -866,7 +866,7 @@ public final class Utils implements Constants {
@NonNull @NonNull
public static ParcelableStatus findStatus(final Context context, final AccountKey accountKey, public static ParcelableStatus findStatus(final Context context, final AccountKey accountKey,
final String accountHost, final long statusId) final long statusId)
throws TwitterException { throws TwitterException {
if (context == null) throw new NullPointerException(); if (context == null) throw new NullPointerException();
final ParcelableStatus cached = findStatusInDatabases(context, accountKey, statusId); final ParcelableStatus cached = findStatusInDatabases(context, accountKey, statusId);
@ -1793,23 +1793,24 @@ public final class Utils implements Constants {
context.startActivity(intent); context.startActivity(intent);
} }
public static void openStatus(final Context context, final long accountId, final long statusId) { public static void openStatus(final Context context, final AccountKey accountKey, final long statusId) {
if (context == null || accountId <= 0 || statusId <= 0) return; if (context == null || statusId <= 0) return;
final Uri uri = LinkCreator.getTwidereStatusLink(accountId, statusId); final Uri uri = LinkCreator.getTwidereStatusLink(accountKey, statusId);
final Intent intent = new Intent(Intent.ACTION_VIEW, uri); final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
context.startActivity(intent); context.startActivity(intent);
} }
public static void openStatus(final Context context, final ParcelableStatus status, Bundle activityOptions) { public static void openStatus(final Context context, final ParcelableStatus status, Bundle activityOptions) {
if (context == null || status == null) return; if (context == null || status == null) return;
final long account_id = status.account_id, status_id = status.id; final AccountKey accountKey = new AccountKey(status.account_id, status.account_host);
final long statusId = status.id;
final Bundle extras = new Bundle(); final Bundle extras = new Bundle();
extras.putParcelable(EXTRA_STATUS, status); extras.putParcelable(EXTRA_STATUS, status);
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_STATUS); builder.authority(AUTHORITY_STATUS);
builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_ID, String.valueOf(account_id)); builder.appendQueryParameter(QUERY_PARAM_ACCOUNT_KEY, accountKey.toString());
builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, String.valueOf(status_id)); builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, String.valueOf(statusId));
final Intent intent = new Intent(Intent.ACTION_VIEW, builder.build()); final Intent intent = new Intent(Intent.ACTION_VIEW, builder.build());
intent.setExtrasClassLoader(context.getClassLoader()); intent.setExtrasClassLoader(context.getClassLoader());
intent.putExtras(extras); intent.putExtras(extras);
@ -1921,7 +1922,7 @@ public final class Utils implements Constants {
} }
public static void openUserListDetails(final Context context, final long accountId, final long listId, public static void openUserListDetails(final Context context, final AccountKey accountId, final long listId,
final long userId, final String screenName, final String listName) { final long userId, final String screenName, final String listName) {
if (context == null) return; if (context == null) return;
final Uri.Builder builder = new Uri.Builder(); final Uri.Builder builder = new Uri.Builder();
@ -2505,12 +2506,15 @@ public final class Utils implements Constants {
} }
@Nullable @Nullable
public static ParcelableUser getUserForConversation(Context context, long accountId, public static ParcelableUser getUserForConversation(Context context, AccountKey accountKey,
long conversationId) { long conversationId) {
final ContentResolver cr = context.getContentResolver(); final ContentResolver cr = context.getContentResolver();
final Expression where = Expression.and(Expression.equals(ConversationEntries.ACCOUNT_ID, accountId), final Expression where = Expression.and(getAccountCompareExpression(),
Expression.equals(ConversationEntries.CONVERSATION_ID, conversationId)); Expression.equalsArgs(ConversationEntries.CONVERSATION_ID));
final Cursor c = cr.query(ConversationEntries.CONTENT_URI, null, where.getSQL(), null, null); final String[] whereArgs = {String.valueOf(accountKey.getId()), accountKey.getHost(),
String.valueOf(conversationId)};
final Cursor c = cr.query(ConversationEntries.CONTENT_URI, null, where.getSQL(), whereArgs,
null);
if (c == null) return null; if (c == null) return null;
try { try {
if (c.moveToFirst()) return ParcelableUserUtils.fromDirectMessageConversationEntry(c); if (c.moveToFirst()) return ParcelableUserUtils.fromDirectMessageConversationEntry(c);

View File

@ -1,20 +1,22 @@
package org.mariotaku.twidere.util.media; package org.mariotaku.twidere.util.media;
import org.mariotaku.twidere.model.AccountKey;
/** /**
* Created by mariotaku on 16/1/28. * Created by mariotaku on 16/1/28.
*/ */
public class MediaExtra { public class MediaExtra {
long accountId; AccountKey accountKey;
boolean useThumbor = true; boolean useThumbor = true;
String fallbackUrl; String fallbackUrl;
boolean skipUrlReplacing; boolean skipUrlReplacing;
public long getAccountId() { public AccountKey getAccountKey() {
return accountId; return accountKey;
} }
public void setAccountId(long accountId) { public void setAccountKey(AccountKey accountKey) {
this.accountId = accountId; this.accountKey = accountKey;
} }
public boolean isUseThumbor() { public boolean isUseThumbor() {

View File

@ -118,7 +118,7 @@ public class TwidereMediaDownloader implements MediaDownloader, Constants {
final boolean useThumbor; final boolean useThumbor;
if (extra instanceof MediaExtra) { if (extra instanceof MediaExtra) {
useThumbor = ((MediaExtra) extra).isUseThumbor(); useThumbor = ((MediaExtra) extra).isUseThumbor();
account = DataStoreUtils.getCredentials(mContext, ((MediaExtra) extra).getAccountId()); account = DataStoreUtils.getCredentials(mContext, ((MediaExtra) extra).getAccountKey());
auth = TwitterAPIFactory.getAuthorization(account); auth = TwitterAPIFactory.getAuthorization(account);
} else { } else {
useThumbor = true; useThumbor = true;

View File

@ -35,6 +35,7 @@ import android.widget.TextView;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.AccountKey;
import org.mariotaku.twidere.model.ParcelableMedia; import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.util.ParcelableMediaUtils; import org.mariotaku.twidere.model.util.ParcelableMediaUtils;
import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MediaLoaderWrapper;
@ -90,7 +91,7 @@ public class CardMediaContainer extends ViewGroup implements Constants {
public void displayMedia(@Nullable final ParcelableMedia[] mediaArray, public void displayMedia(@Nullable final ParcelableMedia[] mediaArray,
@NonNull final MediaLoaderWrapper loader, @NonNull final MediaLoaderWrapper loader,
final long accountId, final long extraId, final AccountKey accountId, final long extraId,
final OnMediaClickListener mediaClickListener, final OnMediaClickListener mediaClickListener,
final MediaLoadingHandler loadingHandler) { final MediaLoadingHandler loadingHandler) {
displayMedia(mediaArray, loader, accountId, extraId, false, mediaClickListener, displayMedia(mediaArray, loader, accountId, extraId, false, mediaClickListener,
@ -99,7 +100,7 @@ public class CardMediaContainer extends ViewGroup implements Constants {
public void displayMedia(@Nullable final ParcelableMedia[] mediaArray, public void displayMedia(@Nullable final ParcelableMedia[] mediaArray,
@NonNull final MediaLoaderWrapper loader, @NonNull final MediaLoaderWrapper loader,
final long accountId, final long extraId, boolean withCredentials, final AccountKey accountId, final long extraId, boolean withCredentials,
final OnMediaClickListener mediaClickListener, final OnMediaClickListener mediaClickListener,
final MediaLoadingHandler loadingHandler) { final MediaLoadingHandler loadingHandler) {
if (mediaArray == null || mMediaPreviewStyle == VALUE_MEDIA_PREVIEW_STYLE_CODE_NONE) { if (mediaArray == null || mMediaPreviewStyle == VALUE_MEDIA_PREVIEW_STYLE_CODE_NONE) {
@ -300,18 +301,18 @@ public class CardMediaContainer extends ViewGroup implements Constants {
} }
public interface OnMediaClickListener { public interface OnMediaClickListener {
void onMediaClick(View view, ParcelableMedia media, long accountId, long id); void onMediaClick(View view, ParcelableMedia media, AccountKey accountKey, long id);
} }
private static class ImageGridClickListener implements View.OnClickListener { private static class ImageGridClickListener implements View.OnClickListener {
private final WeakReference<OnMediaClickListener> mListenerRef; private final WeakReference<OnMediaClickListener> mListenerRef;
private final long mAccountId; private final AccountKey mAccountKey;
private final long mExtraId; private final long mExtraId;
ImageGridClickListener(final OnMediaClickListener listener, final long accountId, ImageGridClickListener(final OnMediaClickListener listener, final AccountKey accountKey,
final long extraId) { final long extraId) {
mListenerRef = new WeakReference<>(listener); mListenerRef = new WeakReference<>(listener);
mAccountId = accountId; mAccountKey = accountKey;
mExtraId = extraId; mExtraId = extraId;
} }
@ -319,7 +320,7 @@ public class CardMediaContainer extends ViewGroup implements Constants {
public void onClick(final View v) { public void onClick(final View v) {
final OnMediaClickListener listener = mListenerRef.get(); final OnMediaClickListener listener = mListenerRef.get();
if (listener == null) return; if (listener == null) return;
listener.onMediaClick(v, (ParcelableMedia) v.getTag(), mAccountId, mExtraId); listener.onMediaClick(v, (ParcelableMedia) v.getTag(), mAccountKey, mExtraId);
} }
} }

View File

@ -27,6 +27,7 @@ import android.widget.ImageView;
import org.mariotaku.twidere.adapter.iface.ContentCardClickListener; import org.mariotaku.twidere.adapter.iface.ContentCardClickListener;
import org.mariotaku.twidere.graphic.like.LikeAnimationDrawable; import org.mariotaku.twidere.graphic.like.LikeAnimationDrawable;
import org.mariotaku.twidere.model.AccountKey;
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.view.CardMediaContainer; import org.mariotaku.twidere.view.CardMediaContainer;
@ -47,7 +48,7 @@ public interface IStatusViewHolder extends CardMediaContainer.OnMediaClickListen
ImageView getProfileTypeView(); ImageView getProfileTypeView();
@Override @Override
void onMediaClick(View view, ParcelableMedia media, long accountId, long extraId); void onMediaClick(View view, ParcelableMedia media, AccountKey accountKey, long extraId);
void setStatusClickListener(StatusClickListener listener); void setStatusClickListener(StatusClickListener listener);