migrating account
This commit is contained in:
parent
8add2c32a5
commit
5fe7ef804c
|
@ -123,6 +123,10 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
|
|||
@JsonField(name = "status_user_following")
|
||||
@CursorField(value = Activities.STATUS_USER_FOLLOWING, excludeWrite = true)
|
||||
public boolean status_user_following;
|
||||
|
||||
@ParcelableThisPlease
|
||||
public int account_color;
|
||||
|
||||
public transient long[] after_filtered_source_ids;
|
||||
public transient ParcelableUser[] after_filtered_sources;
|
||||
|
||||
|
@ -130,18 +134,6 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
|
|||
public ParcelableActivity() {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static ParcelableStatus getActivityStatus(@NonNull ParcelableActivity activity) {
|
||||
if (Activity.Action.MENTION.equals(activity.action)) {
|
||||
return activity.target_object_statuses[0];
|
||||
} else if (Activity.Action.REPLY.equals(activity.action)) {
|
||||
return activity.target_statuses[0];
|
||||
} else if (Activity.Action.QUOTE.equals(activity.action)) {
|
||||
return activity.target_statuses[0];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static int calculateHashCode(AccountKey accountKey, long timestamp, long maxPosition, long minPosition) {
|
||||
int result = accountKey.hashCode();
|
||||
result = 31 * result + (int) (timestamp ^ (timestamp >>> 32));
|
||||
|
|
|
@ -300,6 +300,10 @@ public class ParcelableStatus implements Parcelable, Comparable<ParcelableStatus
|
|||
|
||||
@CursorField(value = Statuses._ID, excludeWrite = true)
|
||||
long _id;
|
||||
|
||||
@ParcelableThisPlease
|
||||
public int account_color;
|
||||
|
||||
public static final Creator<ParcelableStatus> CREATOR = new Creator<ParcelableStatus>() {
|
||||
public ParcelableStatus createFromParcel(Parcel source) {
|
||||
ParcelableStatus target = new ParcelableStatus();
|
||||
|
|
|
@ -27,6 +27,7 @@ import android.content.Intent;
|
|||
import android.content.SharedPreferences;
|
||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||
import android.database.ContentObserver;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.PorterDuff.Mode;
|
||||
import android.graphics.Rect;
|
||||
import android.net.Uri;
|
||||
|
@ -327,6 +328,10 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
|
|||
final Window window = getWindow();
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
||||
window.setStatusBarColor(Color.TRANSPARENT);
|
||||
}
|
||||
}
|
||||
super.onCreate(savedInstanceState);
|
||||
mMultiSelectHandler = new MultiSelectEventHandler(this);
|
||||
|
@ -691,7 +696,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
|
|||
for (int i = 0, j = mPagerAdapter.getCount(); i < j; i++) {
|
||||
final SupportTabSpec tab = mPagerAdapter.getTab(i);
|
||||
if (tabType.equals(CustomTabUtils.getTabTypeAlias(tab.type))) {
|
||||
if (tab.args != null && CustomTabUtils.hasAccountId(tab.args,
|
||||
if (tab.args != null && CustomTabUtils.hasAccountId(this, tab.args,
|
||||
getActivatedAccountKeys(), accountId)) {
|
||||
initialTab = i;
|
||||
break;
|
||||
|
@ -919,7 +924,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
|
|||
}
|
||||
switch (spec.type) {
|
||||
case CustomTabType.HOME_TIMELINE: {
|
||||
final AccountKey[] accountKeys = Utils.getAccountKeys(spec.args);
|
||||
final AccountKey[] accountKeys = Utils.getAccountKeys(mContext, spec.args);
|
||||
final String tagWithAccounts = Utils.getReadPositionTagWithAccounts(mContext,
|
||||
true, ReadPositionTag.HOME_TIMELINE, accountKeys);
|
||||
final long position = mReadStateManager.getPosition(tagWithAccounts);
|
||||
|
@ -930,7 +935,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
|
|||
break;
|
||||
}
|
||||
case CustomTabType.NOTIFICATIONS_TIMELINE: {
|
||||
final AccountKey[] accountIds = Utils.getAccountKeys(spec.args);
|
||||
final AccountKey[] accountIds = Utils.getAccountKeys(mContext, spec.args);
|
||||
final String tagWithAccounts = Utils.getReadPositionTagWithAccounts(mContext,
|
||||
true, ReadPositionTag.ACTIVITIES_ABOUT_ME, accountIds);
|
||||
final long position = mReadStateManager.getPosition(tagWithAccounts);
|
||||
|
|
|
@ -222,7 +222,7 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
|
|||
switch (getItemViewType(position)) {
|
||||
case ITEM_VIEW_TYPE_STATUS: {
|
||||
final ParcelableActivity activity = getActivity(position);
|
||||
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
|
||||
final ParcelableStatus status = ParcelableActivityUtils.getActivityStatus(activity);
|
||||
assert status != null;
|
||||
final IStatusViewHolder statusViewHolder = (IStatusViewHolder) holder;
|
||||
statusViewHolder.displayStatus(status, true, true);
|
||||
|
@ -436,7 +436,7 @@ public abstract class AbsActivitiesAdapter<Data> extends LoadMoreSupportAdapter<
|
|||
if (adapter == null) return;
|
||||
final Context context = adapter.getContext();
|
||||
final ParcelableActivity activity = adapter.getActivity(position);
|
||||
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
|
||||
final ParcelableStatus status = ParcelableActivityUtils.getActivityStatus(activity);
|
||||
assert status != null;
|
||||
IntentUtils.openUserProfile(context, status.account_key, status.user_id,
|
||||
status.user_screen_name, null, true, UserFragment.Referral.TIMELINE_STATUS);
|
||||
|
|
|
@ -172,7 +172,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
|
|||
openActivity(activity);
|
||||
return true;
|
||||
}
|
||||
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
|
||||
final ParcelableStatus status = ParcelableActivityUtils.getActivityStatus(activity);
|
||||
if (status == null) return false;
|
||||
if (action == null) {
|
||||
action = handler.getKeyAction(CONTEXT_TAG_STATUS, keyCode, event, metaState);
|
||||
|
@ -206,7 +206,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
|
|||
}
|
||||
|
||||
private void openActivity(ParcelableActivity activity) {
|
||||
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
|
||||
final ParcelableStatus status = ParcelableActivityUtils.getActivityStatus(activity);
|
||||
if (status != null) {
|
||||
IntentUtils.openStatus(getContext(), status, null);
|
||||
} else {
|
||||
|
@ -348,7 +348,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
|
|||
@Override
|
||||
public void onMediaClick(IStatusViewHolder holder, View view, ParcelableMedia media, int position) {
|
||||
final AbsActivitiesAdapter<Data> adapter = getAdapter();
|
||||
final ParcelableStatus status = ParcelableActivity.getActivityStatus(adapter.getActivity(position));
|
||||
final ParcelableStatus status = ParcelableActivityUtils.getActivityStatus(adapter.getActivity(position));
|
||||
if (status == null) return;
|
||||
IntentUtils.openMedia(getActivity(), status, media, null, true);
|
||||
// BEGIN HotMobi
|
||||
|
@ -413,6 +413,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
|
|||
@Override
|
||||
public void onStatusClick(IStatusViewHolder holder, int position) {
|
||||
final ParcelableStatus status = getActivityStatus(position);
|
||||
if (status == null) return;
|
||||
IntentUtils.openStatus(getContext(), status, null);
|
||||
}
|
||||
|
||||
|
@ -421,7 +422,7 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
|
|||
final AbsActivitiesAdapter<Data> adapter = getAdapter();
|
||||
final ParcelableActivity activity = adapter.getActivity(position);
|
||||
if (activity == null) return null;
|
||||
return ParcelableActivity.getActivityStatus(activity);
|
||||
return ParcelableActivityUtils.getActivityStatus(activity);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -582,7 +582,7 @@ public class AccountsDashboardFragment extends BaseSupportFragment implements Lo
|
|||
|
||||
private boolean hasAccountInTab(SupportTabSpec tab, AccountKey accountId, boolean isActivated) {
|
||||
if (tab.args == null) return false;
|
||||
final AccountKey[] accountKeys = Utils.getAccountKeys(tab.args);
|
||||
final AccountKey[] accountKeys = Utils.getAccountKeys(getContext(), tab.args);
|
||||
if (accountKeys == null) return isActivated;
|
||||
return ArrayUtils.contains(accountKeys, accountId);
|
||||
}
|
||||
|
|
|
@ -44,6 +44,7 @@ import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosi
|
|||
import org.mariotaku.twidere.loader.support.ExtendedObjectCursorLoader;
|
||||
import org.mariotaku.twidere.model.AccountKey;
|
||||
import org.mariotaku.twidere.model.BaseRefreshTaskParam;
|
||||
import org.mariotaku.twidere.model.ParcelableAccount;
|
||||
import org.mariotaku.twidere.model.ParcelableActivity;
|
||||
import org.mariotaku.twidere.model.ParcelableActivityCursorIndices;
|
||||
import org.mariotaku.twidere.model.RefreshTaskParam;
|
||||
|
@ -53,6 +54,7 @@ import org.mariotaku.twidere.model.message.GetActivitiesTaskEvent;
|
|||
import org.mariotaku.twidere.model.message.StatusDestroyedEvent;
|
||||
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
|
||||
import org.mariotaku.twidere.model.message.StatusRetweetedEvent;
|
||||
import org.mariotaku.twidere.model.util.ParcelableAccountUtils;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
|
||||
|
@ -122,7 +124,7 @@ public abstract class CursorActivitiesFragment extends AbsActivitiesFragment<Lis
|
|||
adapter.setShowAccountsColor(accountKeys.length > 1);
|
||||
final String[] projection = Activities.COLUMNS;
|
||||
return new CursorActivitiesLoader(context, uri, projection, selection, expression.whereArgs,
|
||||
sortOrder, fromUser);
|
||||
sortOrder, fromUser, accountKeys);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -133,7 +135,7 @@ public abstract class CursorActivitiesFragment extends AbsActivitiesFragment<Lis
|
|||
@Override
|
||||
protected AccountKey[] getAccountKeys() {
|
||||
final Bundle args = getArguments();
|
||||
AccountKey[] accountKeys = Utils.getAccountKeys(args);
|
||||
final AccountKey[] accountKeys = Utils.getAccountKeys(getContext(), args);
|
||||
if (accountKeys != null) {
|
||||
return accountKeys;
|
||||
}
|
||||
|
@ -323,29 +325,48 @@ public abstract class CursorActivitiesFragment extends AbsActivitiesFragment<Lis
|
|||
}
|
||||
|
||||
public static class CursorActivitiesLoader extends ExtendedObjectCursorLoader<ParcelableActivity> {
|
||||
private final AccountKey[] mAccountKeys;
|
||||
|
||||
public CursorActivitiesLoader(Context context, Uri uri, String[] projection,
|
||||
String selection, String[] selectionArgs, String sortOrder,
|
||||
boolean fromUser) {
|
||||
boolean fromUser, AccountKey[] accountKeys) {
|
||||
super(context, ParcelableActivityCursorIndices.class, uri, projection, selection, selectionArgs, sortOrder, fromUser);
|
||||
mAccountKeys = accountKeys;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ObjectCursor<ParcelableActivity> createObjectCursor(Cursor cursor, ObjectCursor.CursorIndices<ParcelableActivity> indices) {
|
||||
return new ActivityCursor(cursor, indices, DataStoreUtils.getFilteredUserIds(getContext()));
|
||||
final long[] filteredUserIds = DataStoreUtils.getFilteredUserIds(getContext());
|
||||
final ParcelableAccount[] accounts = ParcelableAccountUtils.getAccounts(getContext(), mAccountKeys);
|
||||
return new ActivityCursor(cursor, indices, filteredUserIds, accounts);
|
||||
}
|
||||
|
||||
public static class ActivityCursor extends ObjectCursor<ParcelableActivity> {
|
||||
|
||||
private final long[] filteredUserIds;
|
||||
private final ParcelableAccount[] accounts;
|
||||
|
||||
public ActivityCursor(Cursor cursor, CursorIndices<ParcelableActivity> indies, long[] filteredUserIds) {
|
||||
public ActivityCursor(Cursor cursor, CursorIndices<ParcelableActivity> indies, long[] filteredUserIds, ParcelableAccount[] accounts) {
|
||||
super(cursor, indies);
|
||||
this.filteredUserIds = filteredUserIds;
|
||||
this.accounts = accounts;
|
||||
}
|
||||
|
||||
public long[] getFilteredUserIds() {
|
||||
return filteredUserIds;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ParcelableActivity get(Cursor cursor, CursorIndices<ParcelableActivity> indices) {
|
||||
final ParcelableActivity activity = super.get(cursor, indices);
|
||||
for (ParcelableAccount account : accounts) {
|
||||
if (account.account_key.equals(activity.account_key)) {
|
||||
activity.account_color = account.color;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return activity;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@ package org.mariotaku.twidere.fragment.support;
|
|||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.database.ContentObserver;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
|
@ -32,10 +33,10 @@ import android.support.v4.content.Loader;
|
|||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.mariotaku.library.objectcursor.ObjectCursor;
|
||||
import org.mariotaku.sqliteqb.library.ArgsArray;
|
||||
import org.mariotaku.sqliteqb.library.Columns.Column;
|
||||
import org.mariotaku.sqliteqb.library.Expression;
|
||||
import org.mariotaku.sqliteqb.library.RawItemArray;
|
||||
import org.mariotaku.twidere.R;
|
||||
import org.mariotaku.twidere.activity.support.HomeActivity;
|
||||
import org.mariotaku.twidere.adapter.AbsStatusesAdapter;
|
||||
|
@ -43,6 +44,7 @@ import org.mariotaku.twidere.adapter.ListParcelableStatusesAdapter;
|
|||
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
|
||||
import org.mariotaku.twidere.loader.support.ExtendedObjectCursorLoader;
|
||||
import org.mariotaku.twidere.model.AccountKey;
|
||||
import org.mariotaku.twidere.model.ParcelableAccount;
|
||||
import org.mariotaku.twidere.model.ParcelableStatus;
|
||||
import org.mariotaku.twidere.model.ParcelableStatusCursorIndices;
|
||||
import org.mariotaku.twidere.model.SimpleRefreshTaskParam;
|
||||
|
@ -52,6 +54,7 @@ import org.mariotaku.twidere.model.message.GetStatusesTaskEvent;
|
|||
import org.mariotaku.twidere.model.message.StatusDestroyedEvent;
|
||||
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
|
||||
import org.mariotaku.twidere.model.message.StatusRetweetedEvent;
|
||||
import org.mariotaku.twidere.model.util.ParcelableAccountUtils;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
|
||||
|
@ -118,8 +121,8 @@ public abstract class CursorStatusesFragment extends AbsStatusesFragment<List<Pa
|
|||
final String[] projection = Statuses.COLUMNS;
|
||||
final String[] selectionArgs = TwidereArrayUtils.toStringArray(accountKeys, 0,
|
||||
accountKeys.length);
|
||||
return new ExtendedObjectCursorLoader<>(context, ParcelableStatusCursorIndices.class, uri,
|
||||
projection, selection, selectionArgs, sortOrder, fromUser);
|
||||
return new CursorStatusesLoader(context, uri,
|
||||
projection, selection, selectionArgs, sortOrder, fromUser, accountKeys);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -185,7 +188,7 @@ public abstract class CursorStatusesFragment extends AbsStatusesFragment<List<Pa
|
|||
@Override
|
||||
protected AccountKey[] getAccountKeys() {
|
||||
final Bundle args = getArguments();
|
||||
final AccountKey[] accountKeys = Utils.getAccountKeys(args);
|
||||
final AccountKey[] accountKeys = Utils.getAccountKeys(getContext(), args);
|
||||
if (accountKeys != null) {
|
||||
return accountKeys;
|
||||
}
|
||||
|
@ -332,4 +335,45 @@ public abstract class CursorStatusesFragment extends AbsStatusesFragment<List<Pa
|
|||
|
||||
protected abstract void updateRefreshState();
|
||||
|
||||
public static class CursorStatusesLoader extends ExtendedObjectCursorLoader<ParcelableStatus> {
|
||||
private final AccountKey[] mAccountKeys;
|
||||
|
||||
public CursorStatusesLoader(Context context, Uri uri, String[] projection,
|
||||
String selection, String[] selectionArgs, String sortOrder,
|
||||
boolean fromUser, AccountKey[] accountKeys) {
|
||||
super(context, ParcelableStatusCursorIndices.class, uri, projection, selection, selectionArgs, sortOrder, fromUser);
|
||||
mAccountKeys = accountKeys;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected ObjectCursor<ParcelableStatus> createObjectCursor(final Cursor cursor,
|
||||
final ObjectCursor.CursorIndices<ParcelableStatus> indices) {
|
||||
final ParcelableAccount[] accounts = ParcelableAccountUtils.getAccounts(getContext(), mAccountKeys);
|
||||
return new StatusCursor(cursor, indices, accounts);
|
||||
}
|
||||
|
||||
|
||||
public static class StatusCursor extends ObjectCursor<ParcelableStatus> {
|
||||
|
||||
private final ParcelableAccount[] accounts;
|
||||
|
||||
public StatusCursor(Cursor cursor, CursorIndices<ParcelableStatus> indies, ParcelableAccount[] accounts) {
|
||||
super(cursor, indies);
|
||||
this.accounts = accounts;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ParcelableStatus get(Cursor cursor, CursorIndices<ParcelableStatus> indices) {
|
||||
final ParcelableStatus activity = super.get(cursor, indices);
|
||||
for (ParcelableAccount account : accounts) {
|
||||
if (account.account_key.equals(activity.account_key)) {
|
||||
activity.account_color = account.color;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return activity;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,9 +42,9 @@ import android.view.View;
|
|||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.mariotaku.sqliteqb.library.ArgsArray;
|
||||
import org.mariotaku.sqliteqb.library.Columns.Column;
|
||||
import org.mariotaku.sqliteqb.library.Expression;
|
||||
import org.mariotaku.sqliteqb.library.RawItemArray;
|
||||
import org.mariotaku.twidere.R;
|
||||
import org.mariotaku.twidere.activity.iface.IControlBarActivity;
|
||||
import org.mariotaku.twidere.activity.support.HomeActivity;
|
||||
|
@ -70,6 +70,7 @@ import org.mariotaku.twidere.util.IntentUtils;
|
|||
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
|
||||
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
|
||||
import org.mariotaku.twidere.util.RecyclerViewNavigationHelper;
|
||||
import org.mariotaku.twidere.util.TwidereArrayUtils;
|
||||
import org.mariotaku.twidere.util.Utils;
|
||||
import org.mariotaku.twidere.util.content.SupportFragmentReloadCursorObserver;
|
||||
|
||||
|
@ -153,8 +154,10 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
|
|||
public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
|
||||
final Uri uri = DirectMessages.ConversationEntries.CONTENT_URI;
|
||||
final AccountKey[] accountIds = getAccountKeys();
|
||||
final Expression account_where = Expression.in(new Column(Statuses.ACCOUNT_KEY), new RawItemArray(accountIds));
|
||||
return new CursorLoader(getActivity(), uri, null, account_where.getSQL(), null, null);
|
||||
final String selection = Expression.in(new Column(Statuses.ACCOUNT_KEY),
|
||||
new ArgsArray(accountIds.length)).getSQL();
|
||||
final String[] selectionArgs = TwidereArrayUtils.toStringArray(accountIds, 0, accountIds.length);
|
||||
return new CursorLoader(getActivity(), uri, null, selection, selectionArgs, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -343,7 +346,7 @@ public class DirectMessagesFragment extends AbsContentListRecyclerViewFragment<M
|
|||
@NonNull
|
||||
protected AccountKey[] getAccountKeys() {
|
||||
final Bundle args = getArguments();
|
||||
AccountKey[] accountKeys = Utils.getAccountKeys(args);
|
||||
AccountKey[] accountKeys = Utils.getAccountKeys(getContext(), args);
|
||||
if (accountKeys != null) {
|
||||
return accountKeys;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ import android.support.v4.app.LoaderManager;
|
|||
|
||||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import org.mariotaku.twidere.adapter.AbsStatusesAdapter;
|
||||
import org.mariotaku.twidere.adapter.ListParcelableStatusesAdapter;
|
||||
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
|
||||
import org.mariotaku.twidere.adapter.iface.IStatusesAdapter;
|
||||
|
@ -104,7 +105,7 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment<Lis
|
|||
|
||||
@Override
|
||||
protected AccountKey[] getAccountKeys() {
|
||||
return Utils.getAccountKeys(getArguments());
|
||||
return Utils.getAccountKeys(getContext(), getArguments());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -133,8 +134,9 @@ public abstract class ParcelableStatusesFragment extends AbsStatusesFragment<Lis
|
|||
if ((position & IndicatorPosition.START) != 0) return;
|
||||
super.onLoadMoreContents(position);
|
||||
if (position == 0) return;
|
||||
final IStatusesAdapter<List<ParcelableStatus>> adapter = getAdapter();
|
||||
final ParcelableStatus status = adapter.getStatus(adapter.getItemCount() - 1);
|
||||
final AbsStatusesAdapter<List<ParcelableStatus>> adapter = getAdapter();
|
||||
final ParcelableStatus status = adapter.getStatus(adapter.getStatusStartIndex() +
|
||||
adapter.getStatusCount() - 1);
|
||||
AccountKey[] accountKeys = {status.account_key};
|
||||
final long[] maxIds = {status.id};
|
||||
getStatuses(new BaseRefreshTaskParam(accountKeys, maxIds, null));
|
||||
|
|
|
@ -118,6 +118,7 @@ import org.mariotaku.twidere.model.ParcelableUser;
|
|||
import org.mariotaku.twidere.model.SingleResponse;
|
||||
import org.mariotaku.twidere.model.message.FavoriteTaskEvent;
|
||||
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
|
||||
import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
|
||||
import org.mariotaku.twidere.model.util.ParcelableMediaUtils;
|
||||
import org.mariotaku.twidere.model.util.ParcelableStatusUtils;
|
||||
import org.mariotaku.twidere.model.util.ParcelableUserUtils;
|
||||
|
@ -996,7 +997,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
|
|||
retweetedByView.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
profileContainer.drawEnd(DataStoreUtils.getAccountColor(context, status.account_key));
|
||||
profileContainer.drawEnd(status.account_color);
|
||||
|
||||
final int layoutPosition = getLayoutPosition();
|
||||
final boolean skipLinksInText = status.extras != null && status.extras.support_entities;
|
||||
|
@ -2484,7 +2485,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
|
|||
ParcelableActivityCursorIndices ci = new ParcelableActivityCursorIndices(activityCursor);
|
||||
while (!activityCursor.isAfterLast()) {
|
||||
final ParcelableActivity activity = ci.newObject(activityCursor);
|
||||
ParcelableStatus activityStatus = ParcelableActivity.getActivityStatus(activity);
|
||||
ParcelableStatus activityStatus = ParcelableActivityUtils.getActivityStatus(activity);
|
||||
if (activityStatus != null) {
|
||||
activityStatus.favorite_count = activitySummary.favoriteCount;
|
||||
activityStatus.reply_count = activitySummary.replyCount;
|
||||
|
|
|
@ -524,11 +524,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
|
|||
mUser = user;
|
||||
final int userColor = mUserColorNameManager.getUserColor(user.id, true);
|
||||
mProfileImageView.setBorderColor(userColor != 0 ? userColor : Color.WHITE);
|
||||
if (user.account_color != 0) {
|
||||
mProfileNameContainer.drawEnd(user.account_color);
|
||||
} else {
|
||||
mProfileNameContainer.drawEnd(DataStoreUtils.getAccountColor(activity, user.account_key));
|
||||
}
|
||||
final String nick = mUserColorNameManager.getUserNickname(user.id, true);
|
||||
mNameView.setText(mBidiFormatter.unicodeWrap(TextUtils.isEmpty(nick) ? user.name : getString(R.string.name_with_nickname, user.name, nick)));
|
||||
final int typeIconRes = Utils.getUserTypeIconRes(user.is_verified, user.is_protected);
|
||||
|
|
|
@ -23,13 +23,12 @@ import android.content.Context;
|
|||
import android.os.Bundle;
|
||||
import android.support.v4.content.AsyncTaskLoader;
|
||||
|
||||
import org.mariotaku.twidere.api.twitter.TwitterException;
|
||||
import org.mariotaku.twidere.constant.IntentConstants;
|
||||
import org.mariotaku.twidere.model.AccountKey;
|
||||
import org.mariotaku.twidere.model.ParcelableCredentials;
|
||||
import org.mariotaku.twidere.model.ParcelableStatus;
|
||||
import org.mariotaku.twidere.model.SingleResponse;
|
||||
|
||||
import org.mariotaku.twidere.api.twitter.TwitterException;
|
||||
import org.mariotaku.twidere.model.util.ParcelableCredentialsUtils;
|
||||
|
||||
import static org.mariotaku.twidere.constant.IntentConstants.EXTRA_ACCOUNT;
|
||||
|
@ -66,8 +65,11 @@ public class ParcelableStatusLoader extends AsyncTaskLoader<SingleResponse<Parce
|
|||
}
|
||||
}
|
||||
try {
|
||||
final ParcelableStatus status = findStatus(getContext(), mAccountId, mStatusId);
|
||||
final ParcelableCredentials credentials = ParcelableCredentialsUtils.getCredentials(getContext(), mAccountId);
|
||||
final ParcelableStatus status = findStatus(getContext(), mAccountId, mStatusId);
|
||||
if (credentials != null) {
|
||||
status.account_color = credentials.color;
|
||||
}
|
||||
final SingleResponse<ParcelableStatus> response = SingleResponse.getInstance(status);
|
||||
final Bundle extras = response.getExtras();
|
||||
extras.putParcelable(EXTRA_ACCOUNT, credentials);
|
||||
|
|
|
@ -73,7 +73,7 @@ public final class ParcelableUserLoader extends AsyncTaskLoader<SingleResponse<P
|
|||
final Context context = getContext();
|
||||
final ContentResolver resolver = context.getContentResolver();
|
||||
final AccountKey accountKey = mAccountKey;
|
||||
int accountColor = DataStoreUtils.getAccountColor(context, accountKey);
|
||||
final int accountColor = DataStoreUtils.getAccountColor(context, accountKey);
|
||||
if (!mOmitIntentExtra && mExtras != null) {
|
||||
final ParcelableUser user = mExtras.getParcelable(EXTRA_USER);
|
||||
if (user != null) {
|
||||
|
|
|
@ -30,7 +30,8 @@ import org.mariotaku.twidere.util.collection.NoDuplicatesArrayList;
|
|||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class ParcelableUsersLoader extends AsyncTaskLoader<List<ParcelableUser>> implements IExtendedLoader, Constants {
|
||||
public abstract class ParcelableUsersLoader extends AsyncTaskLoader<List<ParcelableUser>>
|
||||
implements IExtendedLoader, Constants {
|
||||
|
||||
private final List<ParcelableUser> mData = Collections
|
||||
.synchronizedList(new NoDuplicatesArrayList<ParcelableUser>());
|
||||
|
|
|
@ -39,7 +39,9 @@ import org.mariotaku.twidere.api.twitter.model.Status;
|
|||
import org.mariotaku.twidere.app.TwidereApplication;
|
||||
import org.mariotaku.twidere.model.AccountKey;
|
||||
import org.mariotaku.twidere.model.ListResponse;
|
||||
import org.mariotaku.twidere.model.ParcelableCredentials;
|
||||
import org.mariotaku.twidere.model.ParcelableStatus;
|
||||
import org.mariotaku.twidere.model.util.ParcelableCredentialsUtils;
|
||||
import org.mariotaku.twidere.model.util.ParcelableStatusUtils;
|
||||
import org.mariotaku.twidere.util.InternalTwitterContentUtils;
|
||||
import org.mariotaku.twidere.util.JsonSerializer;
|
||||
|
@ -77,7 +79,8 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader
|
|||
@Inject
|
||||
SharedPreferencesWrapper mPreferences;
|
||||
|
||||
public TwitterAPIStatusesLoader(final Context context, final AccountKey accountKey,
|
||||
public TwitterAPIStatusesLoader(@NonNull final Context context,
|
||||
@Nullable final AccountKey accountKey,
|
||||
final long sinceId, final long maxId,
|
||||
final List<ParcelableStatus> data,
|
||||
@Nullable final String[] savedStatusesArgs,
|
||||
|
@ -93,6 +96,16 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader
|
|||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public final ListResponse<ParcelableStatus> loadInBackground() {
|
||||
final Context context = getContext();
|
||||
if (mAccountKey == null) {
|
||||
return ListResponse.getListInstance(new TwitterException("No Account"));
|
||||
}
|
||||
final ParcelableCredentials credentials = ParcelableCredentialsUtils.getCredentials(context,
|
||||
mAccountKey);
|
||||
if (credentials == null) {
|
||||
return ListResponse.getListInstance(new TwitterException("No Account"));
|
||||
}
|
||||
|
||||
List<ParcelableStatus> data = getData();
|
||||
if (data == null) {
|
||||
data = new CopyOnWriteArrayList<>();
|
||||
|
@ -110,10 +123,12 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader
|
|||
}
|
||||
}
|
||||
if (!isFromUser()) return ListResponse.getListInstance(data);
|
||||
final Twitter twitter = getTwitter();
|
||||
if (twitter == null) return null;
|
||||
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(context, credentials, true,
|
||||
true);
|
||||
if (twitter == null) {
|
||||
return ListResponse.getListInstance(new TwitterException("No Account"));
|
||||
}
|
||||
final List<Status> statuses;
|
||||
final Context context = getContext();
|
||||
final SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
|
||||
final int loadItemLimit = prefs.getInt(KEY_LOAD_ITEM_LIMIT, DEFAULT_LOAD_ITEM_LIMIT);
|
||||
final boolean noItemsBefore = data.isEmpty();
|
||||
|
@ -130,7 +145,7 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader
|
|||
}
|
||||
}
|
||||
statuses = getStatuses(twitter, paging);
|
||||
if (!Utils.isOfficialCredentials(getContext(), getAccountKey())) {
|
||||
if (!Utils.isOfficialCredentials(context, getAccountKey())) {
|
||||
InternalTwitterContentUtils.getStatusesWithQuoteData(twitter, statuses);
|
||||
}
|
||||
} catch (final TwitterException e) {
|
||||
|
@ -166,7 +181,10 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader
|
|||
&& statuses.size() >= loadItemLimit;
|
||||
for (int i = 0, j = statuses.size(); i < j; i++) {
|
||||
final Status status = statuses.get(i);
|
||||
data.add(ParcelableStatusUtils.fromStatus(status, mAccountKey, insertGap && isGapEnabled() && minIdx == i));
|
||||
final ParcelableStatus item = ParcelableStatusUtils.fromStatus(status, mAccountKey,
|
||||
insertGap && isGapEnabled() && minIdx == i);
|
||||
item.account_color = credentials.color;
|
||||
data.add(item);
|
||||
}
|
||||
|
||||
final SQLiteDatabase db = TwidereApplication.getInstance(context).getSQLiteDatabase();
|
||||
|
@ -205,11 +223,6 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader
|
|||
@NonNull
|
||||
protected abstract List<Status> getStatuses(@NonNull Twitter twitter, Paging paging) throws TwitterException;
|
||||
|
||||
@Nullable
|
||||
protected final Twitter getTwitter() {
|
||||
return TwitterAPIFactory.getTwitterInstance(getContext(), mAccountKey, true, true);
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
protected abstract boolean shouldFilterStatus(final SQLiteDatabase database, final ParcelableStatus status);
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ import org.mariotaku.twidere.api.twitter.Twitter;
|
|||
import org.mariotaku.twidere.api.twitter.TwitterException;
|
||||
import org.mariotaku.twidere.api.twitter.model.User;
|
||||
import org.mariotaku.twidere.model.AccountKey;
|
||||
import org.mariotaku.twidere.model.ListResponse;
|
||||
import org.mariotaku.twidere.model.ParcelableUser;
|
||||
import org.mariotaku.twidere.model.util.ParcelableUserUtils;
|
||||
import org.mariotaku.twidere.util.TwitterAPIFactory;
|
||||
|
@ -48,16 +49,19 @@ public abstract class TwitterAPIUsersLoader extends ParcelableUsersLoader {
|
|||
|
||||
@Override
|
||||
public List<ParcelableUser> loadInBackground() {
|
||||
if (mAccountKey == null) return null;
|
||||
if (mAccountKey == null) {
|
||||
return ListResponse.getListInstance(new TwitterException("No Account"));
|
||||
}
|
||||
final Twitter twitter = TwitterAPIFactory.getTwitterInstance(getContext(), mAccountKey, true);
|
||||
if (twitter == null) return null;
|
||||
if (twitter == null)
|
||||
return ListResponse.getListInstance(new TwitterException("No Account"));
|
||||
final List<ParcelableUser> data = getData();
|
||||
final List<User> users;
|
||||
try {
|
||||
users = getUsers(twitter);
|
||||
} catch (final TwitterException e) {
|
||||
Log.w(LOGTAG, e);
|
||||
return data;
|
||||
return ListResponse.getListInstance(data);
|
||||
}
|
||||
int pos = data.size();
|
||||
for (final User user : users) {
|
||||
|
@ -68,7 +72,7 @@ public abstract class TwitterAPIUsersLoader extends ParcelableUsersLoader {
|
|||
pos++;
|
||||
}
|
||||
Collections.sort(data);
|
||||
return data;
|
||||
return ListResponse.getListInstance(data);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
|
|
@ -13,6 +13,7 @@ import android.text.style.StyleSpan;
|
|||
|
||||
import org.mariotaku.twidere.R;
|
||||
import org.mariotaku.twidere.api.twitter.model.Activity;
|
||||
import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
|
||||
import org.mariotaku.twidere.util.UserColorNameManager;
|
||||
import org.oshkimaadziig.george.androidutils.SpanFormatter;
|
||||
|
||||
|
@ -201,7 +202,7 @@ public class ActivityTitleSummaryMessage {
|
|||
case Activity.Action.MENTION:
|
||||
case Activity.Action.REPLY:
|
||||
case Activity.Action.QUOTE: {
|
||||
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
|
||||
final ParcelableStatus status = ParcelableActivityUtils.getActivityStatus(activity);
|
||||
if (status == null) return null;
|
||||
final SpannableString title = new SpannableString(manager.getDisplayName(status,
|
||||
nameFirst, false));
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
package org.mariotaku.twidere.model.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import org.mariotaku.twidere.model.AccountKey;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
|
||||
import org.mariotaku.twidere.util.DataStoreUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Created by mariotaku on 16/3/7.
|
||||
*/
|
||||
public class AccountKeyUtils {
|
||||
|
||||
@Nullable
|
||||
public static AccountKey findById(Context context, long id) {
|
||||
final String[] projection = {Accounts.ACCOUNT_KEY};
|
||||
final Cursor cur = DataStoreUtils.findAccountCursorsById(context, projection, id);
|
||||
if (cur == null) return null;
|
||||
try {
|
||||
if (cur.moveToFirst()) return AccountKey.valueOf(cur.getString(0));
|
||||
} finally {
|
||||
cur.close();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static AccountKey[] findByIds(Context context, long... id) {
|
||||
final String[] projection = {Accounts.ACCOUNT_KEY};
|
||||
final Cursor cur = DataStoreUtils.findAccountCursorsById(context, projection, id);
|
||||
if (cur == null) return new AccountKey[0];
|
||||
try {
|
||||
final ArrayList<AccountKey> accountKeys = new ArrayList<>();
|
||||
cur.moveToFirst();
|
||||
while (!cur.isAfterLast()) {
|
||||
accountKeys.add(AccountKey.valueOf(cur.getString(0)));
|
||||
cur.moveToNext();
|
||||
}
|
||||
return accountKeys.toArray(new AccountKey[accountKeys.size()]);
|
||||
} finally {
|
||||
cur.close();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -5,14 +5,15 @@ import android.database.Cursor;
|
|||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import org.mariotaku.sqliteqb.library.ArgsArray;
|
||||
import org.mariotaku.sqliteqb.library.Columns;
|
||||
import org.mariotaku.sqliteqb.library.Expression;
|
||||
import org.mariotaku.sqliteqb.library.RawItemArray;
|
||||
import org.mariotaku.twidere.model.AccountKey;
|
||||
import org.mariotaku.twidere.model.ParcelableAccount;
|
||||
import org.mariotaku.twidere.model.ParcelableAccountCursorIndices;
|
||||
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
|
||||
import org.mariotaku.twidere.util.DataStoreUtils;
|
||||
import org.mariotaku.twidere.util.TwidereArrayUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
@ -53,12 +54,20 @@ public class ParcelableAccountUtils {
|
|||
return list.toArray(new ParcelableAccount[list.size()]);
|
||||
}
|
||||
|
||||
public static ParcelableAccount[] getAccounts(@NonNull final Context context) {
|
||||
final Cursor cur = context.getContentResolver().query(Accounts.CONTENT_URI,
|
||||
Accounts.COLUMNS_NO_CREDENTIALS, null, null, null);
|
||||
if (cur == null) return new ParcelableAccount[0];
|
||||
return getAccounts(cur, new ParcelableAccountCursorIndices(cur));
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static ParcelableAccount[] getAccounts(@Nullable final Context context, @Nullable final AccountKey... accountIds) {
|
||||
if (context == null) return new ParcelableAccount[0];
|
||||
final String where = accountIds != null ? Expression.in(new Columns.Column(Accounts.ACCOUNT_KEY),
|
||||
new RawItemArray(AccountKey.getIds(accountIds))).getSQL() : null;
|
||||
final Cursor cur = context.getContentResolver().query(Accounts.CONTENT_URI, Accounts.COLUMNS_NO_CREDENTIALS, where, null, null);
|
||||
public static ParcelableAccount[] getAccounts(@NonNull final Context context, @NonNull final AccountKey... accountIds) {
|
||||
final String where = Expression.in(new Columns.Column(Accounts.ACCOUNT_KEY),
|
||||
new ArgsArray(accountIds.length)).getSQL();
|
||||
final String[] whereArgs = TwidereArrayUtils.toStringArray(accountIds);
|
||||
final Cursor cur = context.getContentResolver().query(Accounts.CONTENT_URI,
|
||||
Accounts.COLUMNS_NO_CREDENTIALS, where, whereArgs, null);
|
||||
if (cur == null) return new ParcelableAccount[0];
|
||||
return getAccounts(cur, new ParcelableAccountCursorIndices(cur));
|
||||
}
|
||||
|
|
|
@ -1,10 +1,14 @@
|
|||
package org.mariotaku.twidere.model.util;
|
||||
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.collections.primitives.ArrayLongList;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
import org.mariotaku.twidere.api.twitter.model.Activity;
|
||||
import org.mariotaku.twidere.model.AccountKey;
|
||||
import org.mariotaku.twidere.model.ParcelableActivity;
|
||||
import org.mariotaku.twidere.model.ParcelableStatus;
|
||||
import org.mariotaku.twidere.model.ParcelableUser;
|
||||
|
||||
/**
|
||||
|
@ -84,4 +88,21 @@ public class ParcelableActivityUtils {
|
|||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
public static ParcelableStatus getActivityStatus(@NonNull ParcelableActivity activity) {
|
||||
if (Activity.Action.MENTION.equals(activity.action)) {
|
||||
final ParcelableStatus status = activity.target_object_statuses[0];
|
||||
status.account_color = activity.account_color;
|
||||
return status;
|
||||
} else if (Activity.Action.REPLY.equals(activity.action)) {
|
||||
final ParcelableStatus status = activity.target_statuses[0];
|
||||
status.account_color = activity.account_color;
|
||||
return status;
|
||||
} else if (Activity.Action.QUOTE.equals(activity.action)) {
|
||||
final ParcelableStatus status = activity.target_statuses[0];
|
||||
status.account_color = activity.account_color;
|
||||
return status;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -482,13 +482,14 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
|
|||
rowId = mDatabaseWrapper.insertWithOnConflict(table, null, values,
|
||||
SQLiteDatabase.CONFLICT_IGNORE);
|
||||
} else if (tableId == TABLE_ID_CACHED_RELATIONSHIPS) {
|
||||
final long accountId = values.getAsLong(CachedRelationships.ACCOUNT_KEY);
|
||||
final String accountKey = values.getAsString(CachedRelationships.ACCOUNT_KEY);
|
||||
final long userId = values.getAsLong(CachedRelationships.USER_ID);
|
||||
final Expression where = Expression.and(
|
||||
Expression.equals(CachedRelationships.ACCOUNT_KEY, accountId),
|
||||
Expression.equals(CachedRelationships.USER_ID, userId)
|
||||
Expression.equalsArgs(CachedRelationships.ACCOUNT_KEY),
|
||||
Expression.equalsArgs(CachedRelationships.USER_ID)
|
||||
);
|
||||
if (mDatabaseWrapper.update(table, values, where.getSQL(), null) > 0) {
|
||||
final String[] whereArgs = {accountKey, String.valueOf(userId)};
|
||||
if (mDatabaseWrapper.update(table, values, where.getSQL(), whereArgs) > 0) {
|
||||
final String[] projection = {CachedRelationships._ID};
|
||||
final Cursor c = mDatabaseWrapper.query(table, projection, where.getSQL(), null,
|
||||
null, null, null);
|
||||
|
|
|
@ -44,6 +44,7 @@ import org.mariotaku.twidere.model.ParcelableUser;
|
|||
import org.mariotaku.twidere.model.ParcelableUserMention;
|
||||
import org.mariotaku.twidere.model.ParcelableUserValuesCreator;
|
||||
import org.mariotaku.twidere.model.draft.SendDirectMessageActionExtra;
|
||||
import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
|
||||
import org.mariotaku.twidere.model.util.ParcelableMediaUtils;
|
||||
import org.mariotaku.twidere.model.util.ParcelableStatusUtils;
|
||||
import org.mariotaku.twidere.model.util.ParcelableUserUtils;
|
||||
|
@ -202,7 +203,7 @@ public final class ContentValuesCreator implements TwidereConstants {
|
|||
@NonNull
|
||||
public static ContentValues createActivity(final ParcelableActivity activity) {
|
||||
final ContentValues values = new ContentValues();
|
||||
final ParcelableStatus status = ParcelableActivity.getActivityStatus(activity);
|
||||
final ParcelableStatus status = ParcelableActivityUtils.getActivityStatus(activity);
|
||||
if (status != null) {
|
||||
createStatusActivity(status, values);
|
||||
}
|
||||
|
|
|
@ -291,8 +291,9 @@ public class CustomTabUtils implements Constants {
|
|||
return tabType != null && CUSTOM_TABS_CONFIGURATION_MAP.containsKey(getTabTypeAlias(tabType));
|
||||
}
|
||||
|
||||
public static boolean hasAccountId(@NonNull Bundle args, AccountKey[] activatedAccountKeys, AccountKey accountKey) {
|
||||
final AccountKey[] accountKeys = Utils.getAccountKeys(args);
|
||||
public static boolean hasAccountId(final Context context, @NonNull final Bundle args,
|
||||
final AccountKey[] activatedAccountKeys, AccountKey accountKey) {
|
||||
final AccountKey[] accountKeys = Utils.getAccountKeys(context, args);
|
||||
if (accountKeys != null) {
|
||||
return ArrayUtils.contains(accountKeys, accountKey);
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@ import android.os.Bundle;
|
|||
import android.provider.BaseColumns;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.WorkerThread;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.bluelinelabs.logansquare.JsonMapper;
|
||||
|
@ -613,6 +614,7 @@ public class DataStoreUtils implements Constants {
|
|||
return filterExpression;
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
public static int getAccountColor(final Context context, final AccountKey accountKey) {
|
||||
if (context == null) return Color.TRANSPARENT;
|
||||
final Integer cached = sAccountColors.get(accountKey);
|
||||
|
@ -819,8 +821,8 @@ public class DataStoreUtils implements Constants {
|
|||
if (cur == null) return messageIds;
|
||||
try {
|
||||
while (cur.moveToNext()) {
|
||||
final long accountId = cur.getLong(0);
|
||||
int idx = ArrayUtils.indexOf(keys, accountId);
|
||||
final AccountKey accountKey = AccountKey.valueOf(cur.getString(0));
|
||||
int idx = ArrayUtils.indexOf(keys, accountKey);
|
||||
if (idx < 0) continue;
|
||||
messageIds[idx] = cur.getLong(1);
|
||||
}
|
||||
|
@ -894,6 +896,20 @@ public class DataStoreUtils implements Constants {
|
|||
return cr.query(Accounts.CONTENT_URI, columns, where, whereArgs, null);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static Cursor findAccountCursorsById(@NonNull final Context context, final String[] columns,
|
||||
final long... ids) {
|
||||
if (ids == null) return null;
|
||||
final ContentResolver cr = context.getContentResolver();
|
||||
Expression[] expressions = new Expression[ids.length];
|
||||
for (int i = 0, j = ids.length; i < j; i++) {
|
||||
expressions[i] = Expression.likeRaw(new Column(Accounts.ACCOUNT_KEY), "?||\'@%\'");
|
||||
}
|
||||
final String where = Expression.or(expressions).getSQL();
|
||||
final String[] whereArgs = TwidereArrayUtils.toStringArray(ids);
|
||||
return cr.query(Accounts.CONTENT_URI, columns, where, whereArgs, null);
|
||||
}
|
||||
|
||||
public static String getAccountType(@NonNull final Context context, @NonNull final AccountKey accountKey) {
|
||||
final String[] projection = {Accounts.ACCOUNT_TYPE};
|
||||
final Cursor cur = getAccountCursor(context, projection, accountKey);
|
||||
|
|
|
@ -109,14 +109,31 @@ public class TwitterAPIFactory implements TwidereConstants {
|
|||
return getTwitterInstance(context, accountKey, includeEntities, includeRetweets, Twitter.class);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static Twitter getTwitterInstance(@NonNull final Context context,
|
||||
@NonNull final ParcelableCredentials credentials,
|
||||
final boolean includeEntities, final boolean includeRetweets) {
|
||||
return getTwitterInstance(context, credentials, includeEntities, includeRetweets, Twitter.class);
|
||||
}
|
||||
|
||||
|
||||
@Nullable
|
||||
@WorkerThread
|
||||
public static <T> T getTwitterInstance(@NonNull final Context context,
|
||||
@NonNull final AccountKey accountKey,
|
||||
final boolean includeEntities, final boolean includeRetweets,
|
||||
final boolean includeEntities,
|
||||
final boolean includeRetweets,
|
||||
@NonNull Class<T> cls) {
|
||||
final ParcelableCredentials credentials = ParcelableCredentialsUtils.getCredentials(context, accountKey);
|
||||
if (credentials == null) return null;
|
||||
return getTwitterInstance(context, credentials, includeEntities, includeRetweets, cls);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static <T> T getTwitterInstance(@NonNull final Context context,
|
||||
@NonNull final ParcelableCredentials credentials,
|
||||
final boolean includeEntities, final boolean includeRetweets,
|
||||
@NonNull Class<T> cls) {
|
||||
final HashMap<String, String> extraParams = new HashMap<>();
|
||||
extraParams.put("include_entities", String.valueOf(includeEntities));
|
||||
extraParams.put("include_retweets", String.valueOf(includeRetweets));
|
||||
|
|
|
@ -174,6 +174,7 @@ import org.mariotaku.twidere.model.ParcelableUser;
|
|||
import org.mariotaku.twidere.model.ParcelableUserMention;
|
||||
import org.mariotaku.twidere.model.PebbleMessage;
|
||||
import org.mariotaku.twidere.model.TwitterAccountExtra;
|
||||
import org.mariotaku.twidere.model.util.AccountKeyUtils;
|
||||
import org.mariotaku.twidere.model.util.ParcelableCredentialsUtils;
|
||||
import org.mariotaku.twidere.model.util.ParcelableStatusUtils;
|
||||
import org.mariotaku.twidere.model.util.ParcelableUserUtils;
|
||||
|
@ -779,26 +780,27 @@ public final class Utils implements Constants {
|
|||
}
|
||||
|
||||
@Nullable
|
||||
public static AccountKey[] getAccountKeys(@Nullable Bundle args) {
|
||||
public static AccountKey[] getAccountKeys(@NonNull Context context, @Nullable Bundle args) {
|
||||
if (args == null) return null;
|
||||
if (args.containsKey(EXTRA_ACCOUNT_KEYS)) {
|
||||
return newParcelableArray(args.getParcelableArray(EXTRA_ACCOUNT_KEYS), AccountKey.CREATOR);
|
||||
} else if (args.containsKey(EXTRA_ACCOUNT_KEY)) {
|
||||
final AccountKey accountKey = args.getParcelable(EXTRA_ACCOUNT_KEY);
|
||||
if (accountKey == null) return null;
|
||||
if (accountKey == null) return new AccountKey[0];
|
||||
return new AccountKey[]{accountKey};
|
||||
} else if (args.containsKey(EXTRA_ACCOUNT_IDS)) {
|
||||
final long[] accountIds = args.getLongArray(EXTRA_ACCOUNT_IDS);
|
||||
if (accountIds == null) return null;
|
||||
final AccountKey[] accountKeys = new AccountKey[accountIds.length];
|
||||
for (int i = 0, accountIdsLength = accountIds.length; i < accountIdsLength; i++) {
|
||||
accountKeys[i] = new AccountKey(accountIds[i], null);
|
||||
}
|
||||
final AccountKey[] accountKeys = AccountKeyUtils.findByIds(context, accountIds);
|
||||
args.putParcelableArray(EXTRA_ACCOUNT_KEYS, accountKeys);
|
||||
return accountKeys;
|
||||
} else if (args.containsKey(EXTRA_ACCOUNT_ID)) {
|
||||
final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1);
|
||||
if (accountId <= 0) return null;
|
||||
return new AccountKey[]{new AccountKey(accountId, null)};
|
||||
final AccountKey accountKey = AccountKeyUtils.findById(context, accountId);
|
||||
args.putParcelable(EXTRA_ACCOUNT_KEY, accountKey);
|
||||
if (accountKey == null) return new AccountKey[0];
|
||||
return new AccountKey[]{accountKey};
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -330,7 +330,7 @@ public class StatusViewHolder extends ViewHolder implements Constants, IStatusVi
|
|||
}
|
||||
|
||||
if (adapter.shouldShowAccountsColor()) {
|
||||
itemContent.drawEnd(DataStoreUtils.getAccountColor(context, status.account_key));
|
||||
itemContent.drawEnd(status.account_color);
|
||||
} else {
|
||||
itemContent.drawEnd();
|
||||
}
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
<style name="Theme.Compat.Base" parent="Theme.AppCompat">
|
||||
<!-- Window attributes -->
|
||||
<item name="android:windowBackground">@color/background_color_window_dark</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||
|
||||
<item name="android:textColorTertiary">@color/tertiary_text_mtrl_dark</item>
|
||||
<item name="android:textColorTertiaryInverse">@color/tertiary_text_mtrl_light</item>
|
||||
|
@ -32,7 +31,6 @@
|
|||
<style name="Theme.Compat.Base.NoActionBar" parent="Theme.AppCompat.NoActionBar">
|
||||
<!-- Window attributes -->
|
||||
<item name="android:windowBackground">@color/background_color_window_dark</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||
|
||||
<item name="android:textColorTertiary">@color/tertiary_text_mtrl_dark</item>
|
||||
<item name="android:textColorTertiaryInverse">@color/tertiary_text_mtrl_light</item>
|
||||
|
@ -47,7 +45,6 @@
|
|||
<style name="Theme.Compat.Base.DialogWhenLarge" parent="Theme.AppCompat.DialogWhenLarge">
|
||||
<!-- Window attributes -->
|
||||
<item name="windowNormalBackground">@color/background_color_window_dark</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||
|
||||
<item name="android:textColorTertiary">@color/tertiary_text_mtrl_dark</item>
|
||||
<item name="android:textColorTertiaryInverse">@color/tertiary_text_mtrl_light</item>
|
||||
|
@ -56,7 +53,6 @@
|
|||
<style name="Theme.Compat.Base.Light" parent="Theme.AppCompat.Light">
|
||||
<!-- Window attributes -->
|
||||
<item name="android:windowBackground">@color/background_color_window_light</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||
|
||||
<item name="android:textColorTertiary">@color/tertiary_text_mtrl_light</item>
|
||||
<item name="android:textColorTertiaryInverse">@color/tertiary_text_mtrl_dark</item>
|
||||
|
@ -65,7 +61,6 @@
|
|||
<style name="Theme.Compat.Base.Light.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
<!-- Window attributes -->
|
||||
<item name="android:windowBackground">@color/background_color_window_light</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||
|
||||
<item name="android:textColorTertiary">@color/tertiary_text_mtrl_light</item>
|
||||
<item name="android:textColorTertiaryInverse">@color/tertiary_text_mtrl_dark</item>
|
||||
|
@ -80,7 +75,6 @@
|
|||
<style name="Theme.Compat.Base.Light.DialogWhenLarge" parent="Theme.AppCompat.Light.DialogWhenLarge">
|
||||
<!-- Window attributes -->
|
||||
<item name="windowNormalBackground">@color/background_color_window_light</item>
|
||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||
|
||||
<item name="android:textColorTertiary">@color/tertiary_text_mtrl_light</item>
|
||||
<item name="android:textColorTertiaryInverse">@color/tertiary_text_mtrl_dark</item>
|
||||
|
|
Loading…
Reference in New Issue