Add context menus to post footer buttons (AND-161)
This commit is contained in:
@@ -6,6 +6,7 @@ import android.graphics.Color;
|
|||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
@@ -19,6 +20,9 @@ import org.joinmastodon.android.R;
|
|||||||
import org.joinmastodon.android.api.session.AccountSessionManager;
|
import org.joinmastodon.android.api.session.AccountSessionManager;
|
||||||
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
import org.joinmastodon.android.fragments.BaseStatusListFragment;
|
||||||
import org.joinmastodon.android.fragments.ComposeFragment;
|
import org.joinmastodon.android.fragments.ComposeFragment;
|
||||||
|
import org.joinmastodon.android.fragments.account_list.StatusFavoritesListFragment;
|
||||||
|
import org.joinmastodon.android.fragments.account_list.StatusReblogsListFragment;
|
||||||
|
import org.joinmastodon.android.fragments.account_list.StatusRelatedAccountListFragment;
|
||||||
import org.joinmastodon.android.model.Status;
|
import org.joinmastodon.android.model.Status;
|
||||||
import org.joinmastodon.android.model.StatusPrivacy;
|
import org.joinmastodon.android.model.StatusPrivacy;
|
||||||
import org.joinmastodon.android.ui.utils.UiUtils;
|
import org.joinmastodon.android.ui.utils.UiUtils;
|
||||||
@@ -48,6 +52,7 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
|
|||||||
private final ImageView share;
|
private final ImageView share;
|
||||||
private final ColorStateList buttonColors;
|
private final ColorStateList buttonColors;
|
||||||
private final View replyBtn, boostBtn, favoriteBtn, shareBtn;
|
private final View replyBtn, boostBtn, favoriteBtn, shareBtn;
|
||||||
|
private final PopupMenu boostLongTapMenu, favoriteLongTapMenu;
|
||||||
|
|
||||||
private final View.AccessibilityDelegate buttonAccessibilityDelegate=new View.AccessibilityDelegate(){
|
private final View.AccessibilityDelegate buttonAccessibilityDelegate=new View.AccessibilityDelegate(){
|
||||||
@Override
|
@Override
|
||||||
@@ -97,11 +102,20 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
|
|||||||
replyBtn.setOnClickListener(this::onReplyClick);
|
replyBtn.setOnClickListener(this::onReplyClick);
|
||||||
replyBtn.setAccessibilityDelegate(buttonAccessibilityDelegate);
|
replyBtn.setAccessibilityDelegate(buttonAccessibilityDelegate);
|
||||||
boostBtn.setOnClickListener(this::onBoostClick);
|
boostBtn.setOnClickListener(this::onBoostClick);
|
||||||
|
boostBtn.setOnLongClickListener(this::onBoostLongClick);
|
||||||
boostBtn.setAccessibilityDelegate(buttonAccessibilityDelegate);
|
boostBtn.setAccessibilityDelegate(buttonAccessibilityDelegate);
|
||||||
favoriteBtn.setOnClickListener(this::onFavoriteClick);
|
favoriteBtn.setOnClickListener(this::onFavoriteClick);
|
||||||
|
favoriteBtn.setOnLongClickListener(this::onFavoriteLongClick);
|
||||||
favoriteBtn.setAccessibilityDelegate(buttonAccessibilityDelegate);
|
favoriteBtn.setAccessibilityDelegate(buttonAccessibilityDelegate);
|
||||||
shareBtn.setOnClickListener(this::onShareClick);
|
shareBtn.setOnClickListener(this::onShareClick);
|
||||||
shareBtn.setAccessibilityDelegate(buttonAccessibilityDelegate);
|
shareBtn.setAccessibilityDelegate(buttonAccessibilityDelegate);
|
||||||
|
|
||||||
|
favoriteLongTapMenu=new PopupMenu(activity, favoriteBtn);
|
||||||
|
favoriteLongTapMenu.inflate(R.menu.favorite_longtap);
|
||||||
|
favoriteLongTapMenu.setOnMenuItemClickListener(this::onLongTapMenuItemSelected);
|
||||||
|
boostLongTapMenu=new PopupMenu(activity, boostBtn);
|
||||||
|
boostLongTapMenu.inflate(R.menu.boost_longtap);
|
||||||
|
boostLongTapMenu.setOnMenuItemClickListener(this::onLongTapMenuItemSelected);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -172,6 +186,45 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
|
|||||||
UiUtils.openSystemShareSheet(v.getContext(), item.status);
|
UiUtils.openSystemShareSheet(v.getContext(), item.status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean onBoostLongClick(View v){
|
||||||
|
MenuItem boost=boostLongTapMenu.getMenu().findItem(R.id.boost);
|
||||||
|
boost.setTitle(item.status.reblogged ? R.string.undo_reblog : R.string.button_reblog);
|
||||||
|
boostLongTapMenu.show();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean onFavoriteLongClick(View v){
|
||||||
|
MenuItem favorite=favoriteLongTapMenu.getMenu().findItem(R.id.favorite);
|
||||||
|
MenuItem bookmark=favoriteLongTapMenu.getMenu().findItem(R.id.bookmark);
|
||||||
|
favorite.setTitle(item.status.favourited ? R.string.undo_favorite : R.string.button_favorite);
|
||||||
|
bookmark.setTitle(item.status.bookmarked ? R.string.remove_bookmark : R.string.add_bookmark);
|
||||||
|
favoriteLongTapMenu.show();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean onLongTapMenuItemSelected(MenuItem item){
|
||||||
|
int id=item.getItemId();
|
||||||
|
if(id==R.id.favorite){
|
||||||
|
onFavoriteClick(null);
|
||||||
|
}else if(id==R.id.boost){
|
||||||
|
onBoostClick(null);
|
||||||
|
}else if(id==R.id.bookmark){
|
||||||
|
AccountSessionManager.getInstance().getAccount(this.item.accountID).getStatusInteractionController().setBookmarked(this.item.status, !this.item.status.bookmarked);
|
||||||
|
}else if(id==R.id.view_favorites){
|
||||||
|
startAccountListFragment(StatusFavoritesListFragment.class);
|
||||||
|
}else if(id==R.id.view_boosts){
|
||||||
|
startAccountListFragment(StatusReblogsListFragment.class);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startAccountListFragment(Class<? extends StatusRelatedAccountListFragment> cls){
|
||||||
|
Bundle args=new Bundle();
|
||||||
|
args.putString("account", item.parentFragment.getAccountID());
|
||||||
|
args.putParcelable("status", Parcels.wrap(item.status));
|
||||||
|
Nav.go(item.parentFragment.getActivity(), cls, args);
|
||||||
|
}
|
||||||
|
|
||||||
private int descriptionForId(int id){
|
private int descriptionForId(int id){
|
||||||
if(id==R.id.reply_btn)
|
if(id==R.id.reply_btn)
|
||||||
return R.string.button_reply;
|
return R.string.button_reply;
|
||||||
|
|||||||
5
mastodon/src/main/res/menu/boost_longtap.xml
Normal file
5
mastodon/src/main/res/menu/boost_longtap.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:id="@+id/boost" android:title="@string/button_reblog"/>
|
||||||
|
<item android:id="@+id/view_boosts" android:title="@string/view_boosts"/>
|
||||||
|
</menu>
|
||||||
6
mastodon/src/main/res/menu/favorite_longtap.xml
Normal file
6
mastodon/src/main/res/menu/favorite_longtap.xml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:id="@+id/favorite" android:title="@string/button_favorite"/>
|
||||||
|
<item android:id="@+id/bookmark" android:title="@string/add_bookmark"/>
|
||||||
|
<item android:id="@+id/view_favorites" android:title="@string/view_favorites"/>
|
||||||
|
</menu>
|
||||||
@@ -314,7 +314,7 @@
|
|||||||
<string name="instance_signup_closed">This server does not accept new registrations.</string>
|
<string name="instance_signup_closed">This server does not accept new registrations.</string>
|
||||||
<string name="text_copied">Copied to clipboard</string>
|
<string name="text_copied">Copied to clipboard</string>
|
||||||
<string name="add_bookmark">Bookmark</string>
|
<string name="add_bookmark">Bookmark</string>
|
||||||
<string name="remove_bookmark">Remove bookmark</string>
|
<string name="remove_bookmark">Remove Bookmark</string>
|
||||||
<string name="bookmarks">Bookmarks</string>
|
<string name="bookmarks">Bookmarks</string>
|
||||||
<string name="your_favorites">Your favorites</string>
|
<string name="your_favorites">Your favorites</string>
|
||||||
<string name="login_title">Welcome back</string>
|
<string name="login_title">Welcome back</string>
|
||||||
@@ -751,4 +751,8 @@
|
|||||||
<string name="visibility_subtitle_unlisted">Fewer algorithmic fanfares</string>
|
<string name="visibility_subtitle_unlisted">Fewer algorithmic fanfares</string>
|
||||||
<string name="visibility_subtitle_followers">Only your followers</string>
|
<string name="visibility_subtitle_followers">Only your followers</string>
|
||||||
<string name="visibility_subtitle_private">Everyone mentioned in the post</string>
|
<string name="visibility_subtitle_private">Everyone mentioned in the post</string>
|
||||||
|
<string name="view_boosts">View Boosts</string>
|
||||||
|
<string name="view_favorites">View Favorites</string>
|
||||||
|
<string name="undo_reblog">Undo Boost</string>
|
||||||
|
<string name="undo_favorite">Undo Favorite</string>
|
||||||
</resources>
|
</resources>
|
||||||
Reference in New Issue
Block a user