SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/StatusButtons.java

235 lines
7.9 KiB
Java

package jp.juggler.subwaytooter;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.PopupWindow;
import jp.juggler.subwaytooter.api.entity.TootNotification;
import jp.juggler.subwaytooter.api.entity.TootStatus;
import jp.juggler.subwaytooter.api.entity.TootStatusLike;
import jp.juggler.subwaytooter.api_msp.entity.MSPToot;
import jp.juggler.subwaytooter.table.SavedAccount;
import jp.juggler.subwaytooter.table.UserRelation;
import jp.juggler.subwaytooter.util.LogCategory;
class StatusButtons implements View.OnClickListener, View.OnLongClickListener {
static final LogCategory log = new LogCategory( "StatusButtons" );
private final Column column;
private final ActMain activity;
private final SavedAccount access_info;
private final Button btnBoost;
private final Button btnFavourite;
private final ImageButton btnFollow2;
private final ImageView ivFollowedBy2;
private final View llFollow2;
private final boolean bSimpleList;
StatusButtons( @NonNull ActMain activity, @NonNull Column column, @NonNull View viewRoot, boolean bSimpleList ){
this.activity = activity;
this.column = column;
this.access_info = column.access_info;
this.bSimpleList = bSimpleList;
btnBoost = viewRoot.findViewById( R.id.btnBoost );
btnFavourite = viewRoot.findViewById( R.id.btnFavourite );
btnFollow2 = viewRoot.findViewById( R.id.btnFollow2 );
ivFollowedBy2 = viewRoot.findViewById( R.id.ivFollowedBy2 );
llFollow2 = viewRoot.findViewById( R.id.llFollow2 );
btnBoost.setOnClickListener( this );
btnFavourite.setOnClickListener( this );
btnFollow2.setOnClickListener( this );
btnBoost.setOnLongClickListener( this );
btnFavourite.setOnLongClickListener( this );
btnFollow2.setOnLongClickListener( this );
View v;
//
v = viewRoot.findViewById( R.id.btnMore );
v.setOnClickListener( this );
//
v = viewRoot.findViewById( R.id.btnConversation );
v.setOnClickListener( this );
v.setOnLongClickListener( this );
//
v = viewRoot.findViewById( R.id.btnReply );
v.setOnClickListener( this );
v.setOnLongClickListener( this );
}
private UserRelation relation;
private TootStatusLike status;
@Nullable private TootNotification notification;
void bind( @NonNull TootStatusLike status, @Nullable TootNotification notification ){
this.status = status;
this.notification = notification;
int color_normal = Styler.getAttributeColor( activity, R.attr.colorImageButton );
int color_accent = Styler.getAttributeColor( activity, R.attr.colorImageButtonAccent );
int fav_icon_attr = access_info.isNicoru( status.account ) ? R.attr.ic_nicoru : R.attr.btn_favourite;
if( status instanceof MSPToot ){
setButton( btnBoost, true, color_normal, R.attr.btn_boost, "" );
setButton( btnFavourite, true, color_normal, fav_icon_attr, "" );
}else if( status instanceof TootStatus ){
TootStatus ts = (TootStatus) status;
if( TootStatus.VISIBILITY_DIRECT.equals( ts.visibility ) ){
setButton( btnBoost, false, color_accent, R.attr.ic_mail, "" );
}else if( TootStatus.VISIBILITY_PRIVATE.equals( ts.visibility ) ){
setButton( btnBoost, false, color_accent, R.attr.ic_lock, "" );
}else if( activity.app_state.isBusyBoost( access_info, status ) ){
setButton( btnBoost, false, color_normal, R.attr.btn_refresh, "?" );
}else{
int color = ( ts.reblogged ? color_accent : color_normal );
if( TootStatus.VISIBILITY_UNLISTED.equals( ts.visibility ) ){
setButton( btnBoost, true, color, R.attr.btn_boost, Long.toString( ts.reblogs_count ) );
}else{
setButton( btnBoost, true, color, R.attr.btn_boost, Long.toString( ts.reblogs_count ) );
}
}
if( activity.app_state.isBusyFav( access_info, status ) ){
setButton( btnFavourite, false, color_normal, R.attr.btn_refresh, "?" );
}else{
int color = ( ts.favourited ? color_accent : color_normal );
setButton( btnFavourite, true, color, fav_icon_attr, Long.toString( ts.favourites_count ) );
}
}
if( status.account == null
|| activity.pref == null
|| ! activity.pref.getBoolean( Pref.KEY_SHOW_FOLLOW_BUTTON_IN_BUTTON_BAR, false )
){
llFollow2.setVisibility( View.GONE );
this.relation = null;
}else{
llFollow2.setVisibility( View.VISIBLE );
this.relation = UserRelation.load( access_info.db_id, status.account.id );
Styler.setFollowIcon( activity, btnFollow2, ivFollowedBy2, relation );
}
}
private void setButton( Button b, boolean enabled, int color, int icon_attr, String text ){
Drawable d = Styler.getAttributeDrawable( activity, icon_attr ).mutate();
d.setColorFilter( color, PorterDuff.Mode.SRC_ATOP );
b.setCompoundDrawablesRelativeWithIntrinsicBounds( d, null, null, null );
b.setText( text );
b.setTextColor( color );
b.setEnabled( enabled );
}
PopupWindow close_window;
@Override public void onClick( View v ){
if( close_window != null ) close_window.dismiss();
switch( v.getId() ){
case R.id.btnConversation:
activity.openStatus( activity.nextPosition( column ), access_info, status );
break;
case R.id.btnReply:
if( status instanceof TootStatus && ! access_info.isPseudo() ){
activity.performReply( access_info, (TootStatus) status );
}else{
activity.openReplyFromAnotherAccount( status );
}
break;
case R.id.btnBoost:
if( access_info.isPseudo() ){
activity.openBoostFromAnotherAccount( access_info, status );
}else{
activity.performBoost(
access_info
, status
, ActMain.NOT_CROSS_ACCOUNT
, ! status.reblogged
, false
, !bSimpleList ? null : status.reblogged ? activity.boost_complete_callback : activity.unboost_complete_callback
);
}
break;
case R.id.btnFavourite:
if( access_info.isPseudo() ){
activity.openFavouriteFromAnotherAccount( access_info, status );
}else{
activity.performFavourite(
access_info
, status
, ActMain.NOT_CROSS_ACCOUNT
, ! status.favourited
, !bSimpleList ? null : status.favourited ? activity.unfavourite_complete_callback : activity.favourite_complete_callback
);
}
break;
case R.id.btnMore:
new DlgContextMenu( activity, column, status.account, status, notification ).show();
break;
case R.id.btnFollow2:
if( status == null || status.account == null ){
// 何もしない
}else if( access_info.isPseudo() ){
activity.openFollowFromAnotherAccount( access_info, status.account );
}else if( relation.blocking || relation.muting ){
// 何もしない
}else if( relation.following || relation.requested ){
activity.callFollow( access_info, status.account, false, false, activity.unfollow_complete_callback );
}else{
activity.callFollow( access_info, status.account, true, false, activity.follow_complete_callback );
}
break;
}
}
@Override public boolean onLongClick( View v ){
if( close_window != null ) close_window.dismiss();
switch( v.getId() ){
case R.id.btnConversation:
activity.openStatusOtherInstance( activity.nextPosition( column ), access_info, status );
break;
case R.id.btnBoost:
activity.openBoostFromAnotherAccount( access_info, status );
break;
case R.id.btnFavourite:
activity.openFavouriteFromAnotherAccount( access_info, status );
break;
case R.id.btnFollow2:
if( status != null && status.account != null ){
activity.openFollowFromAnotherAccount( access_info, status.account );
}
break;
case R.id.btnReply:
activity.openReplyFromAnotherAccount( status );
break;
}
return true;
}
}