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:
parent
35749477e6
commit
802cec6bb8
@ -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)) {
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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));
|
||||
|
@ -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)) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user