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

using context menu for statuses

removed activities_by_friends tab
This commit is contained in:
Mariotaku Lee 2016-02-16 23:44:50 +08:00
parent 35749477e6
commit 802cec6bb8
16 changed files with 230 additions and 154 deletions

View File

@ -129,7 +129,7 @@ public class ParcelableActivity implements Comparable<ParcelableActivity>, Parce
}
@Nullable
public static ParcelableStatus getActivityStatus(ParcelableActivity activity) {
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)) {

View File

@ -32,7 +32,10 @@ import android.support.v4.content.Loader;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.OnScrollListener;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import com.desmond.asyncmanager.AsyncManager;
@ -48,16 +51,18 @@ import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.IntentUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.LinkCreator;
import org.mariotaku.twidere.util.RecyclerViewNavigationHelper;
import org.mariotaku.twidere.util.RecyclerViewUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.imageloader.PauseRecyclerViewOnScrollListener;
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
import org.mariotaku.twidere.view.ExtendedRecyclerView;
import org.mariotaku.twidere.view.holder.ActivityTitleSummaryViewHolder;
import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
@ -373,7 +378,13 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
@Override
public void onStatusMenuClick(IStatusViewHolder holder, View menuView, int position) {
if (getActivity() == null) return;
final LinearLayoutManager lm = getLayoutManager();
final View view = lm.findViewByPosition(position);
if (view == null || lm.getItemViewType(view) != AbsActivitiesAdapter.ITEM_VIEW_TYPE_STATUS) {
return;
}
getRecyclerView().showContextMenuForChild(view);
}
@Override
@ -385,7 +396,9 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
@Nullable
private ParcelableStatus getActivityStatus(int position) {
final AbsActivitiesAdapter<Data> adapter = getAdapter();
return ParcelableActivity.getActivityStatus(adapter.getActivity(position));
final ParcelableActivity activity = adapter.getActivity(position);
if (activity == null) return null;
return ParcelableActivity.getActivityStatus(activity);
}
@Override
@ -450,10 +463,10 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
final AbsActivitiesAdapter<Data> adapter = getAdapter();
final RecyclerView recyclerView = getRecyclerView();
final LinearLayoutManager layoutManager = getLayoutManager();
adapter.setListener(this);
registerForContextMenu(recyclerView);
mNavigationHelper = new RecyclerViewNavigationHelper(recyclerView, layoutManager,
adapter, this);
adapter.setListener(this);
mPauseOnScrollListener = new PauseRecyclerViewOnScrollListener(adapter.getMediaLoader().getImageLoader(), false, true);
final Bundle loaderArgs = new Bundle(getArguments());
@ -550,6 +563,49 @@ public abstract class AbsActivitiesFragment<Data> extends AbsContentListRecycler
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
final AbsActivitiesAdapter<Data> adapter = getAdapter();
final MenuInflater inflater = new MenuInflater(getContext());
final ExtendedRecyclerView.ContextMenuInfo contextMenuInfo =
(ExtendedRecyclerView.ContextMenuInfo) menuInfo;
final int position = contextMenuInfo.getPosition();
switch (adapter.getItemViewType(position)) {
case AbsActivitiesAdapter.ITEM_VIEW_TYPE_STATUS: {
final ParcelableStatus status = getActivityStatus(position);
if (status == null) return;
inflater.inflate(R.menu.action_status, menu);
Utils.setMenuForStatus(getContext(), mPreferences, menu, status, mTwitterWrapper);
break;
}
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
final AbsActivitiesAdapter<Data> adapter = getAdapter();
final ExtendedRecyclerView.ContextMenuInfo contextMenuInfo =
(ExtendedRecyclerView.ContextMenuInfo) item.getMenuInfo();
final int position = contextMenuInfo.getPosition();
switch (adapter.getItemViewType(position)) {
case AbsActivitiesAdapter.ITEM_VIEW_TYPE_STATUS: {
final ParcelableStatus status = getActivityStatus(position);
if (status == null) return false;
if (item.getItemId() == R.id.share) {
final Intent shareIntent = Utils.createStatusShareIntent(getActivity(), status);
final Intent chooser = Intent.createChooser(shareIntent, getString(R.string.share_status));
Utils.addCopyLinkIntent(getContext(), chooser, LinkCreator.getTwitterStatusLink(status));
startActivity(chooser);
return true;
}
return Utils.handleMenuItemClick(getActivity(), this, getFragmentManager(),
mUserColorNameManager, mTwitterWrapper, status, item);
}
}
return false;
}
private String getCurrentReadPositionTag() {
final String tag = getReadPositionTagWithAccounts();
if (tag == null) return null;

View File

@ -30,12 +30,11 @@ import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.PopupMenu.OnMenuItemClickListener;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.OnScrollListener;
import android.view.Gravity;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
@ -51,6 +50,7 @@ import org.mariotaku.twidere.annotation.ReadPositionTag;
import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.IntentUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
@ -60,7 +60,7 @@ import org.mariotaku.twidere.util.RecyclerViewNavigationHelper;
import org.mariotaku.twidere.util.RecyclerViewUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.imageloader.PauseRecyclerViewOnScrollListener;
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
import org.mariotaku.twidere.view.ExtendedRecyclerView;
import org.mariotaku.twidere.view.holder.GapViewHolder;
import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder;
@ -122,7 +122,6 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListRecyclerVi
}
}
};
private PopupMenu mPopupMenu;
private final OnScrollListener mOnScrollListener = new OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
@ -133,23 +132,6 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListRecyclerVi
}
};
private RecyclerViewNavigationHelper mNavigationHelper;
private ParcelableStatus mSelectedStatus;
private OnMenuItemClickListener mOnStatusMenuItemClickListener = new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
final ParcelableStatus status = mSelectedStatus;
if (status == null) return false;
if (item.getItemId() == R.id.share) {
final Intent shareIntent = Utils.createStatusShareIntent(getActivity(), status);
final Intent chooser = Intent.createChooser(shareIntent, getString(R.string.share_status));
Utils.addCopyLinkIntent(getContext(), chooser, LinkCreator.getTwitterStatusLink(status));
startActivity(chooser);
return true;
}
return Utils.handleMenuItemClick(getActivity(), AbsStatusesFragment.this,
getFragmentManager(), mUserColorNameManager, mTwitterWrapper, status, item);
}
};
private OnScrollListener mPauseOnScrollListener;
private OnScrollListener mActiveHotMobiScrollTracker;
@ -389,20 +371,11 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListRecyclerVi
@Override
public void onStatusMenuClick(IStatusViewHolder holder, View menuView, int position) {
if (mPopupMenu != null) {
mPopupMenu.dismiss();
}
if (getActivity() == null) return;
final AbsStatusesAdapter<Data> adapter = getAdapter();
final PopupMenu popupMenu = new PopupMenu(adapter.getContext(), menuView,
Gravity.NO_GRAVITY, R.attr.actionOverflowMenuStyle, 0);
popupMenu.setOnMenuItemClickListener(mOnStatusMenuItemClickListener);
popupMenu.inflate(R.menu.action_status);
final ParcelableStatus status = adapter.getStatus(position);
Utils.setMenuForStatus(adapter.getContext(), mPreferences, popupMenu.getMenu(), status, mTwitterWrapper);
popupMenu.show();
mPopupMenu = popupMenu;
mSelectedStatus = status;
final LinearLayoutManager lm = getLayoutManager();
final View view = lm.findViewByPosition(position);
if (view == null) return;
getRecyclerView().showContextMenuForChild(view);
}
@Override
@ -454,14 +427,6 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListRecyclerVi
super.onStop();
}
@Override
public void onDestroyView() {
if (mPopupMenu != null) {
mPopupMenu.dismiss();
}
super.onDestroyView();
}
@Override
public void onDestroy() {
final AbsStatusesAdapter<Data> adapter = getAdapter();
@ -484,10 +449,10 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListRecyclerVi
final AbsStatusesAdapter<Data> adapter = getAdapter();
final RecyclerView recyclerView = getRecyclerView();
final LinearLayoutManager layoutManager = getLayoutManager();
adapter.setListener(this);
registerForContextMenu(recyclerView);
mNavigationHelper = new RecyclerViewNavigationHelper(recyclerView, layoutManager,
adapter, this);
adapter.setListener(this);
mPauseOnScrollListener = new PauseRecyclerViewOnScrollListener(adapter.getMediaLoader().getImageLoader(), false, true);
final Bundle loaderArgs = new Bundle(getArguments());
@ -543,6 +508,34 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListRecyclerVi
return new Rect(0, paddingVertical, 0, paddingVertical);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
final AbsStatusesAdapter<Data> adapter = getAdapter();
final MenuInflater inflater = new MenuInflater(getContext());
final ExtendedRecyclerView.ContextMenuInfo contextMenuInfo =
(ExtendedRecyclerView.ContextMenuInfo) menuInfo;
final ParcelableStatus status = adapter.getStatus(contextMenuInfo.getPosition());
inflater.inflate(R.menu.action_status, menu);
Utils.setMenuForStatus(getContext(), mPreferences, menu, status, mTwitterWrapper);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
final ExtendedRecyclerView.ContextMenuInfo contextMenuInfo =
(ExtendedRecyclerView.ContextMenuInfo) item.getMenuInfo();
final ParcelableStatus status = getAdapter().getStatus(contextMenuInfo.getPosition());
if (status == null) return false;
if (item.getItemId() == R.id.share) {
final Intent shareIntent = Utils.createStatusShareIntent(getActivity(), status);
final Intent chooser = Intent.createChooser(shareIntent, getString(R.string.share_status));
Utils.addCopyLinkIntent(getContext(), chooser, LinkCreator.getTwitterStatusLink(status));
startActivity(chooser);
return true;
}
return Utils.handleMenuItemClick(getActivity(), AbsStatusesFragment.this,
getFragmentManager(), mUserColorNameManager, mTwitterWrapper, status, item);
}
private String getCurrentReadPositionTag() {
final String tag = getReadPositionTagWithAccounts();
if (tag == null) return null;

View File

@ -73,7 +73,6 @@ public class ActivitiesAboutMeFragment extends CursorActivitiesFragment {
@Override
protected void updateRefreshState() {
setRefreshing(mTwitterWrapper.isMentionsTimelineRefreshing());
}
@Override
@ -94,7 +93,7 @@ public class ActivitiesAboutMeFragment extends CursorActivitiesFragment {
@NonNull
@Override
protected ParcelableActivitiesAdapter onCreateAdapter(Context context, boolean compact) {
final ParcelableActivitiesAdapter adapter = super.onCreateAdapter(context, compact);
final ParcelableActivitiesAdapter adapter = new ParcelableActivitiesAdapter(context, compact, false);
final Bundle arguments = getArguments();
if (arguments != null) {
final Bundle extras = arguments.getBundle(EXTRA_EXTRAS);
@ -115,7 +114,7 @@ public class ActivitiesAboutMeFragment extends CursorActivitiesFragment {
@Override
public boolean isRefreshing() {
return mTwitterWrapper.isMentionsTimelineRefreshing();
return false;
}
}

View File

@ -19,19 +19,23 @@
package org.mariotaku.twidere.fragment.support;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter;
import org.mariotaku.twidere.provider.TwidereDataStore;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.util.ErrorInfoStore;
import edu.tsinghua.hotmobi.model.TimelineType;
public class ActivitiesByFriendsFragment extends CursorActivitiesFragment {
@Override
public boolean getActivities(long[] accountIds, long[] maxIds, long[] sinceIds) {
mTwitterWrapper.getActivitiesByFriendsAsync(accountIds, maxIds, sinceIds);
return false;
}
@ -51,7 +55,7 @@ public class ActivitiesByFriendsFragment extends CursorActivitiesFragment {
@Override
public Uri getContentUri() {
return TwidereDataStore.CONTENT_URI_EMPTY;
return Activities.ByFriends.CONTENT_URI;
}
@Override
@ -69,6 +73,23 @@ public class ActivitiesByFriendsFragment extends CursorActivitiesFragment {
}
@NonNull
@Override
protected ParcelableActivitiesAdapter onCreateAdapter(Context context, boolean compact) {
final ParcelableActivitiesAdapter adapter = new ParcelableActivitiesAdapter(context, compact,
true);
final Bundle arguments = getArguments();
if (arguments != null) {
final Bundle extras = arguments.getBundle(EXTRA_EXTRAS);
if (extras != null) {
adapter.setFollowingOnly(extras.getBoolean(EXTRA_MY_FOLLOWING_ONLY));
adapter.setMentionsOnly(extras.getBoolean(EXTRA_MENTIONS_ONLY));
}
}
return adapter;
}
@Override
public boolean isRefreshing() {
return false;

View File

@ -42,16 +42,10 @@ import org.mariotaku.sqliteqb.library.RawItemArray;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.HomeActivity;
import org.mariotaku.twidere.adapter.AbsActivitiesAdapter;
import org.mariotaku.twidere.adapter.ParcelableActivitiesAdapter;
import org.mariotaku.twidere.adapter.iface.ILoadMoreSupportAdapter.IndicatorPosition;
import org.mariotaku.twidere.loader.support.ExtendedObjectCursorLoader;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.ParcelableActivityCursorIndices;
import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.ErrorInfoStore;
import org.mariotaku.twidere.model.message.AccountChangedEvent;
import org.mariotaku.twidere.model.message.FavoriteCreatedEvent;
import org.mariotaku.twidere.model.message.FavoriteDestroyedEvent;
@ -59,6 +53,11 @@ 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.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.util.DataStoreUtils;
import org.mariotaku.twidere.util.ErrorInfoStore;
import java.util.List;
@ -176,12 +175,6 @@ public abstract class CursorActivitiesFragment extends AbsActivitiesFragment<Lis
return cursor != null && cursor.size() != 0;
}
@NonNull
@Override
protected ParcelableActivitiesAdapter onCreateAdapter(final Context context, final boolean compact) {
return new ParcelableActivitiesAdapter(context, compact, false);
}
@Override
public void onLoaderReset(Loader<List<ParcelableActivity>> loader) {
getAdapter().setData(null);

View File

@ -52,8 +52,6 @@ import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.CardView;
import android.support.v7.widget.FixedLinearLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.PopupMenu.OnMenuItemClickListener;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.LayoutParams;
import android.support.v7.widget.RecyclerView.ViewHolder;
@ -63,7 +61,7 @@ import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.Gravity;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
@ -108,6 +106,9 @@ import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.model.SingleResponse;
import org.mariotaku.twidere.model.message.FavoriteCreatedEvent;
import org.mariotaku.twidere.model.message.FavoriteDestroyedEvent;
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
import org.mariotaku.twidere.model.util.ParcelableMediaUtils;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
@ -140,12 +141,10 @@ import org.mariotaku.twidere.util.TwitterCardUtils;
import org.mariotaku.twidere.util.TwitterContentUtils;
import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.model.message.FavoriteCreatedEvent;
import org.mariotaku.twidere.model.message.FavoriteDestroyedEvent;
import org.mariotaku.twidere.model.message.StatusListChangedEvent;
import org.mariotaku.twidere.view.CardMediaContainer;
import org.mariotaku.twidere.view.CardMediaContainer.OnMediaClickListener;
import org.mariotaku.twidere.view.ColorLabelRelativeLayout;
import org.mariotaku.twidere.view.ExtendedRecyclerView;
import org.mariotaku.twidere.view.ForegroundColorView;
import org.mariotaku.twidere.view.StatusTextView;
import org.mariotaku.twidere.view.TwitterCardContainer;
@ -184,7 +183,6 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
private RecyclerView mRecyclerView;
private DividerItemDecoration mItemDecoration;
private PopupMenu mPopupMenu;
private StatusAdapter mStatusAdapter;
private LinearLayoutManager mLayoutManager;
@ -196,7 +194,6 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
// Data fields
private boolean mConversationLoaderInitialized;
private boolean mActivityLoaderInitialized;
private ParcelableStatus mSelectedStatus;
private TweetEvent mStatusEvent;
// Listeners
@ -294,15 +291,6 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
}
};
private OnMenuItemClickListener mOnStatusMenuItemClickListener = new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
final ParcelableStatus status = mSelectedStatus;
if (status == null) return false;
return Utils.handleMenuItemClick(getActivity(), StatusFragment.this,
getFragmentManager(), mUserColorNameManager, mTwitterWrapper, status, item);
}
};
@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
@ -369,6 +357,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
mStatusAdapter = new StatusAdapter(this, compact);
mStatusAdapter.setEventListener(this);
mRecyclerView.setAdapter(mStatusAdapter);
registerForContextMenu(mRecyclerView);
mScrollListener = new ContentListScrollListener(this);
mScrollListener.setTouchSlop(ViewConfiguration.get(context).getScaledTouchSlop());
@ -448,20 +437,10 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
@Override
public void onStatusMenuClick(IStatusViewHolder holder, View menuView, int position) {
//TODO show status menu
if (mPopupMenu != null) {
mPopupMenu.dismiss();
}
final PopupMenu popupMenu = new PopupMenu(mStatusAdapter.getContext(), menuView,
Gravity.NO_GRAVITY, R.attr.actionOverflowMenuStyle, 0);
popupMenu.setOnMenuItemClickListener(mOnStatusMenuItemClickListener);
popupMenu.inflate(R.menu.action_status);
final ParcelableStatus status = mStatusAdapter.getStatus(position);
Utils.setMenuForStatus(mStatusAdapter.getContext(), mPreferences, popupMenu.getMenu(), status,
mTwitterWrapper);
popupMenu.show();
mPopupMenu = popupMenu;
mSelectedStatus = status;
if (getActivity() == null) return;
final View view = mLayoutManager.findViewByPosition(position);
if (view == null) return;
mRecyclerView.showContextMenuForChild(view);
}
@Override
@ -768,6 +747,33 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
super.onStop();
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
final MenuInflater inflater = new MenuInflater(getContext());
final ExtendedRecyclerView.ContextMenuInfo contextMenuInfo =
(ExtendedRecyclerView.ContextMenuInfo) menuInfo;
final ParcelableStatus status = mStatusAdapter.getStatus(contextMenuInfo.getPosition());
inflater.inflate(R.menu.action_status, menu);
Utils.setMenuForStatus(getContext(), mPreferences, menu, status, mTwitterWrapper);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
final ExtendedRecyclerView.ContextMenuInfo contextMenuInfo =
(ExtendedRecyclerView.ContextMenuInfo) item.getMenuInfo();
final ParcelableStatus status = mStatusAdapter.getStatus(contextMenuInfo.getPosition());
if (status == null) return false;
if (item.getItemId() == R.id.share) {
final Intent shareIntent = Utils.createStatusShareIntent(getActivity(), status);
final Intent chooser = Intent.createChooser(shareIntent, getString(R.string.share_status));
Utils.addCopyLinkIntent(getContext(), chooser, LinkCreator.getTwitterStatusLink(status));
startActivity(chooser);
return true;
}
return Utils.handleMenuItemClick(getActivity(), this, getFragmentManager(),
mUserColorNameManager, mTwitterWrapper, status, item);
}
@Subscribe
public void notifyStatusListChanged(StatusListChangedEvent event) {
final StatusAdapter adapter = getAdapter();

View File

@ -110,27 +110,25 @@ public class RefreshService extends Service implements Constants {
});
}
} else if (BROADCAST_REFRESH_NOTIFICATIONS.equals(action)) {
if (!isActivitiesAboutMeRefreshing()) {
mTwitterWrapper.getActivitiesAboutMeAsync(new SimpleRefreshTaskParam() {
private long[] accountIds;
mTwitterWrapper.getActivitiesAboutMeAsync(new SimpleRefreshTaskParam() {
private long[] accountIds;
@NonNull
@Override
public long[] getAccountIds() {
if (accountIds != null) return accountIds;
final AccountPreferences[] prefs = AccountPreferences.getAccountPreferences(context,
DataStoreUtils.getAccountIds(context));
return accountIds = getRefreshableIds(prefs, MentionsRefreshableFilter.INSTANCE);
}
@NonNull
@Override
public long[] getAccountIds() {
if (accountIds != null) return accountIds;
final AccountPreferences[] prefs = AccountPreferences.getAccountPreferences(context,
DataStoreUtils.getAccountIds(context));
return accountIds = getRefreshableIds(prefs, MentionsRefreshableFilter.INSTANCE);
}
@Nullable
@Override
public long[] getSinceIds() {
return DataStoreUtils.getNewestActivityMaxPositions(context,
Activities.AboutMe.CONTENT_URI, getAccountIds());
}
});
}
@Nullable
@Override
public long[] getSinceIds() {
return DataStoreUtils.getNewestActivityMaxPositions(context,
Activities.AboutMe.CONTENT_URI, getAccountIds());
}
});
} else if (BROADCAST_REFRESH_DIRECT_MESSAGES.equals(action)) {
if (!isReceivedDirectMessagesRefreshing()) {
mTwitterWrapper.getReceivedDirectMessagesAsync(new SimpleRefreshTaskParam() {
@ -310,10 +308,6 @@ public class RefreshService extends Service implements Constants {
return mTwitterWrapper.isLocalTrendsRefreshing();
}
private boolean isActivitiesAboutMeRefreshing() {
return mTwitterWrapper.isMentionsTimelineRefreshing();
}
private boolean isReceivedDirectMessagesRefreshing() {
return mTwitterWrapper.isReceivedDirectMessagesRefreshing();
}

View File

@ -12,7 +12,7 @@ import org.mariotaku.twidere.api.twitter.model.CursorTimestampResponse;
import org.mariotaku.twidere.api.twitter.model.Paging;
import org.mariotaku.twidere.api.twitter.model.ResponseList;
import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.provider.TwidereDataStore;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.task.twitter.GetActivitiesTask;
import org.mariotaku.twidere.util.ErrorInfoStore;
import org.mariotaku.twidere.util.Utils;
@ -57,6 +57,6 @@ public class GetActivitiesAboutMeTask extends GetActivitiesTask {
@Override
protected Uri getContentUri() {
return TwidereDataStore.Activities.AboutMe.CONTENT_URI;
return Activities.AboutMe.CONTENT_URI;
}
}

View File

@ -9,7 +9,7 @@ import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.Activity;
import org.mariotaku.twidere.api.twitter.model.Paging;
import org.mariotaku.twidere.api.twitter.model.ResponseList;
import org.mariotaku.twidere.provider.TwidereDataStore;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.task.twitter.GetActivitiesTask;
import org.mariotaku.twidere.util.ErrorInfoStore;
@ -40,6 +40,6 @@ public class GetActivitiesByFriendsTask extends GetActivitiesTask {
@Override
protected Uri getContentUri() {
return TwidereDataStore.Activities.ByFriends.CONTENT_URI;
return Activities.ByFriends.CONTENT_URI;
}
}

View File

@ -19,9 +19,9 @@ import org.mariotaku.twidere.api.twitter.TwitterException;
import org.mariotaku.twidere.api.twitter.model.Activity;
import org.mariotaku.twidere.api.twitter.model.Paging;
import org.mariotaku.twidere.api.twitter.model.ResponseList;
import org.mariotaku.twidere.api.twitter.model.Status;
import org.mariotaku.twidere.model.ParcelableActivity;
import org.mariotaku.twidere.model.RefreshTaskParam;
import org.mariotaku.twidere.model.message.GetActivitiesTaskEvent;
import org.mariotaku.twidere.model.util.ParcelableActivityUtils;
import org.mariotaku.twidere.provider.TwidereDataStore.Activities;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
@ -31,10 +31,8 @@ import org.mariotaku.twidere.util.ErrorInfoStore;
import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.TwitterAPIFactory;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.content.ContentResolverUtils;
import org.mariotaku.twidere.util.dagger.GeneralComponentHelper;
import org.mariotaku.twidere.model.message.GetActivitiesTaskEvent;
import java.util.ArrayList;
import java.util.Arrays;
@ -153,16 +151,8 @@ public abstract class GetActivitiesTask extends TaskRunnable<RefreshTaskParam, O
protected abstract void saveReadPosition(long accountId, Twitter twitter);
protected ResponseList<Activity> getActivities(@NonNull final Twitter twitter, final long accountId, final Paging paging) throws TwitterException {
if (Utils.shouldUsePrivateAPIs(context, accountId)) {
return twitter.getActivitiesAboutMe(paging);
}
final ResponseList<Activity> activities = new ResponseList<>();
for (Status status : twitter.getMentionsTimeline(paging)) {
activities.add(Activity.fromMention(accountId, status));
}
return activities;
}
protected abstract ResponseList<Activity> getActivities(@NonNull final Twitter twitter,
final long accountId, final Paging paging) throws TwitterException;
@Override
public void callback(Object result) {

View File

@ -389,10 +389,6 @@ public class AsyncTwitterWrapper extends TwitterWrapper {
|| mAsyncTaskManager.hasRunningTasksForTag(TASK_TAG_STORE_TRENDS);
}
public boolean isMentionsTimelineRefreshing() {
return mAsyncTaskManager.hasRunningTasksForTag(TASK_TAG_GET_MENTIONS);
}
public boolean isReceivedDirectMessagesRefreshing() {
return mAsyncTaskManager.hasRunningTasksForTag(TASK_TAG_GET_RECEIVED_DIRECT_MESSAGES);
}

View File

@ -100,10 +100,11 @@ public class CustomTabUtils implements Constants {
UserListTimelineFragment.class, R.string.list_timeline, R.drawable.ic_action_list,
CustomTabConfiguration.ACCOUNT_REQUIRED, CustomTabConfiguration.FIELD_TYPE_USER_LIST, 7));
CUSTOM_TABS_CONFIGURATION_MAP.put(CustomTabType.ACTIVITIES_BY_FRIENDS, new CustomTabConfiguration(
ActivitiesByFriendsFragment.class, R.string.activities_by_friends,
R.drawable.ic_action_accounts, CustomTabConfiguration.ACCOUNT_REQUIRED,
CustomTabConfiguration.FIELD_TYPE_NONE, 9));
// CUSTOM_TABS_CONFIGURATION_MAP.put(CustomTabType.ACTIVITIES_BY_FRIENDS, new CustomTabConfiguration(
// ActivitiesByFriendsFragment.class, R.string.activities_by_friends,
// R.drawable.ic_action_accounts, CustomTabConfiguration.ACCOUNT_OPTIONAL,
// CustomTabConfiguration.FIELD_TYPE_NONE, 9));
CUSTOM_TABS_CONFIGURATION_MAP.put(CustomTabType.RETWEETS_OF_ME, new CustomTabConfiguration(
RetweetsOfMeFragment.class, R.string.retweets_of_me, R.drawable.ic_action_retweet,
CustomTabConfiguration.ACCOUNT_REQUIRED, CustomTabConfiguration.FIELD_TYPE_NONE, 10));

View File

@ -67,7 +67,6 @@ import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
@ -126,7 +125,6 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.CopyLinkActivity;
import org.mariotaku.twidere.activity.support.AccountSelectorActivity;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.MediaViewerActivity;
import org.mariotaku.twidere.adapter.iface.IBaseAdapter;
import org.mariotaku.twidere.adapter.iface.IBaseCardAdapter;
import org.mariotaku.twidere.annotation.CustomTabType;
@ -152,7 +150,6 @@ import org.mariotaku.twidere.fragment.support.MutesUsersListFragment;
import org.mariotaku.twidere.fragment.support.SavedSearchesListFragment;
import org.mariotaku.twidere.fragment.support.ScheduledStatusesFragment;
import org.mariotaku.twidere.fragment.support.SearchFragment;
import org.mariotaku.twidere.fragment.support.SensitiveContentWarningDialogFragment;
import org.mariotaku.twidere.fragment.support.SetUserNicknameDialogFragment;
import org.mariotaku.twidere.fragment.support.StatusFavoritersListFragment;
import org.mariotaku.twidere.fragment.support.StatusFragment;
@ -184,7 +181,6 @@ import org.mariotaku.twidere.model.ParcelableCredentialsCursorIndices;
import org.mariotaku.twidere.model.ParcelableDirectMessage;
import org.mariotaku.twidere.model.ParcelableDirectMessageCursorIndices;
import org.mariotaku.twidere.model.ParcelableLocation;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableStatusCursorIndices;
import org.mariotaku.twidere.model.ParcelableUser;
@ -2573,9 +2569,11 @@ public final class Utils implements Constants {
return pm.getDrawable(info.packageName, info.metaData.getInt(key), info.applicationInfo);
}
public static boolean handleMenuItemClick(Context context, Fragment fragment, FragmentManager fm,
UserColorNameManager colorNameManager, AsyncTwitterWrapper twitter,
ParcelableStatus status, MenuItem item) {
public static boolean handleMenuItemClick(@NonNull Context context, @Nullable Fragment fragment,
@NonNull FragmentManager fm,
@NonNull UserColorNameManager colorNameManager,
@NonNull AsyncTwitterWrapper twitter,
@NonNull ParcelableStatus status, @NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.copy: {
if (ClipboardUtils.setText(context, status.text_plain)) {

View File

@ -24,8 +24,10 @@ import android.support.v4.view.MotionEventCompat;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.View;
import org.mariotaku.twidere.util.MouseScrollDirectionDecider;
@ -37,6 +39,7 @@ public class ExtendedRecyclerView extends RecyclerView {
private final MouseScrollDirectionDecider mMouseScrollDirectionDecider;
// This value is used when handling generic motion events.
private float mScrollFactor = Float.MIN_VALUE;
private ContextMenuInfo mContextMenuInfo;
public ExtendedRecyclerView(Context context) {
this(context, null);
@ -137,6 +140,19 @@ public class ExtendedRecyclerView extends RecyclerView {
return super.computeVerticalScrollExtent();
}
@Override
protected ContextMenu.ContextMenuInfo getContextMenuInfo() {
return mContextMenuInfo;
}
@Override
public boolean showContextMenuForChild(View originalView) {
final int position = getChildLayoutPosition(originalView);
if (position == RecyclerView.NO_POSITION) return false;
mContextMenuInfo = new ContextMenuInfo(position);
return super.showContextMenuForChild(originalView);
}
/**
* Ported from View.getVerticalScrollFactor.
*/
@ -155,4 +171,16 @@ public class ExtendedRecyclerView extends RecyclerView {
return mScrollFactor;
}
public static class ContextMenuInfo implements ContextMenu.ContextMenuInfo {
private final int position;
public ContextMenuInfo(int position) {
this.position = position;
}
public int getPosition() {
return position;
}
}
}

View File

@ -8,6 +8,7 @@ import android.support.v4.widget.TextViewCompat;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.text.Spanned;
import android.text.TextUtils;
import android.view.ContextMenu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;