package com.nbs.client.assassins.views; import java.sql.Date; import java.util.HashMap; import com.nbs.client.assassins.R; import com.nbs.client.assassins.models.App; import com.nbs.client.assassins.models.Match; import com.nbs.client.assassins.models.MatchMapper; 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.utils.Bus; import com.nbs.client.assassins.views.PlayerStatus.PlayerReadyListener; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v4.content.LocalBroadcastManager; import android.text.format.Time; import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.LinearLayout; import android.widget.TextView; public class GameStatus extends LinearLayout { protected static final String TAG = "GameStatus"; private Match match; HashMap<String, PlayerStatus> players = new HashMap<String, PlayerStatus>(); private Context context; private boolean isFilterRegistered = false; public GameStatus(Context context) { super(context); init(context); } public GameStatus(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(Context context) { this.context = context; } public void update(Match m) { match = m; if(!isFilterRegistered) { registerFilterWithAction(m.id, rcvr); registerFilterWithAction(m.id + "." + Repository.NEW_PLAYER, playersRcvr); isFilterRegistered = true; } if(match.players != null) { for(Player p : match.players) { PlayerStatus status = players.get(p.username); if(status != null) { status.update(p); } else { addPlayer(p); } } } setName(m.name); setStatus(m.startTime); } private void registerFilterWithAction(String action, BroadcastReceiver br) { IntentFilter filter = new IntentFilter(); filter.addAction(action); Bus.register(context, br, filter); } public void setName(String name) { TextView t = (TextView)findViewById(R.id.match_name); t.setText(name); t.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Repository model = App.getRepo(); Log.d(TAG, "setting focused match id to " + match.id); model.getUser().setFocusedMatch(match.id); } }); } public void setStatus(Long startTime) { long sysTime = System.currentTimeMillis(); String status = ""; if(startTime == null) { status = "(starts when all players are ready)"; } else { Time t = new Time(); t.set(startTime*1000); String formattedTime = TimeUtils.format(t); Log.d(TAG, "syst: " + sysTime + " startt: " + startTime); status = "(" + (sysTime > startTime ? "started at " + formattedTime : "starts at " + formattedTime) + ")"; } TextView t = (TextView)findViewById(R.id.match_status); t.setText(status); } private void addPlayer(Player p) { PlayerStatus pStatus = (PlayerStatus)LayoutInflater .from(context).inflate(R.layout.player_status, null); players.put(p.username, pStatus); pStatus.update(p); addView(pStatus); } private BroadcastReceiver rcvr = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { update(MatchMapper.fromExtras(intent.getExtras())); } }; private BroadcastReceiver playersRcvr = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { addPlayer(PlayerMapper.fromExtras(intent.getExtras())); } }; @Override public void finalize() { Bus.unregister(context, rcvr); Bus.unregister(context, playersRcvr); try { super.finalize(); } catch (Throwable e) { e.printStackTrace(); } } }