package com.nbs.client.assassins.views; import com.nbs.client.assassins.R; import com.nbs.client.assassins.models.App; import com.nbs.client.assassins.models.Player; import com.nbs.client.assassins.models.PlayerMapper; import com.nbs.client.assassins.models.Repository; import com.nbs.client.assassins.models.User; import com.nbs.client.assassins.utils.Bus; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v4.content.LocalBroadcastManager; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; public class PlayerStatus extends LinearLayout { public interface PlayerReadyListener { void ready(PlayerStatus view, String matchId); } private static final String TAG = "PlayerStatus"; private Context context; private boolean isFilterRegistered = false; private Player player; public PlayerStatus(Context context) { super(context); init(context); } public PlayerStatus(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context context) { this.context = context; if(!(context instanceof PlayerReadyListener)) { throw new ClassCastException("PayerStatus.context is not instance of PlayerReadyListener"); } } public void update(Player p) { this.player = p; if(!isFilterRegistered) registerFilterWithAction(p.matchId + "." + p.username); setName(p.username); Repository model = App.getRepo(); User user = model.getUser(); if(user.getUsername().equals(p.username) && !Player.READY.equals(p.status)) { setStatus("ready?", context.getResources().getColor(R.color.red)); enableReadyListener(); } else { setStatus(p.status, context.getResources().getColor(R.color.gray)); disableReadyListener(); } invalidate(); } public void disableReadyListener() { TextView t = (TextView)findViewById(R.id.player_status); t.setClickable(false); } public void enableReadyListener() { TextView t = (TextView)findViewById(R.id.player_status); t.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { arg0.setClickable(false); ((PlayerReadyListener)context).ready(PlayerStatus.this, player.matchId); } }); t.setClickable(true); } private void registerFilterWithAction(String action) { Log.d(TAG, "registering filter: '" + action + "'"); filter.addAction(action); Bus.register(context, rcvr, filter); isFilterRegistered = true; } public void setName(String name) { TextView t = (TextView)findViewById(R.id.player_username); t.setText(name); } public void setStatus(String status, int color) { TextView t = (TextView)findViewById(R.id.player_status); t.setText(status); t.setTextColor(color); } private IntentFilter filter = new IntentFilter(); private BroadcastReceiver rcvr = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "onReceive("+intent+")"); update(PlayerMapper.fromExtras(intent.getExtras())); } }; @Override public void finalize() { Bus.unregister(context, rcvr); try { super.finalize(); } catch (Throwable e) { e.printStackTrace(); } } }