package com.nbs.client.assassins.views; import java.util.List; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragment; import com.google.android.gms.maps.model.LatLng; import com.googlecode.androidannotations.annotations.Click; import com.googlecode.androidannotations.annotations.EFragment; import com.googlecode.androidannotations.annotations.ViewById; 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.PlayerModel; import com.nbs.client.assassins.models.Repository; import com.nbs.client.assassins.models.User; import com.nbs.client.assassins.sensors.BearingProvider; import com.nbs.client.assassins.sensors.BearingProviderImpl; import com.nbs.client.assassins.services.LocationService; import com.nbs.client.assassins.services.PushNotifications; import com.nbs.client.assassins.utils.Bus; @EFragment(R.layout.game_fragment) public class GameFragment extends SherlockFragment{ private static final String TAG = "GameFragment"; private static final String HUD_FRAGMENT = "HUDFragment"; private static final String MAP_FRAG_ID = null; MapFragment_ mapFragment; HUDFragment_ hudFragment; @ViewById(R.id.toggle_compass) ImageView toggleCompass; private BearingProvider bearingSource; public GameFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initMapFragment(); registerReceivers(); } private void initIntentFilters(Player player) { Context context = getActivity(); unregisterReceivers(); if(player != null) { IntentFilter playerFilter = new IntentFilter(); playerFilter.addAction(player.matchId + "." + player.username); Bus.register(context, focusedPlayerRcvr, playerFilter); IntentFilter gameFilter = new IntentFilter(); gameFilter.addAction(player.matchId); Bus.register(context, focusedGameRcvr, gameFilter); } IntentFilter userFilter = new IntentFilter(); userFilter.addAction(LocationService.LOCATION_UPDATED); userFilter.addAction(User.LOGOUT_COMPLETE); Bus.register(context, userRcvr, userFilter); IntentFilter focusFilter = new IntentFilter(); focusFilter.addAction(User.FOCUSED_GAME_CHANGED); Bus.register(context, focusedGameChanged, focusFilter); } private void registerReceivers() { Repository model = App.getRepo(); initIntentFilters(model.getMyFocusedPlayer()); } private void unregisterReceivers() { Context context = getActivity(); Bus.unregister(context, focusedPlayerRcvr); Bus.unregister(context, focusedGameRcvr); Bus.unregister(context, userRcvr); Bus.unregister(context, focusedGameChanged); } private void initMapFragment() { FragmentTransaction ft; mapFragment = new MapFragment_(); ft = getActivity().getSupportFragmentManager().beginTransaction(); ft.replace(R.id.game_fragment_container, mapFragment, MAP_FRAG_ID); ft.commit(); bearingSource = new BearingProviderImpl(getActivity()); mapFragment.setBearingProvider(bearingSource); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { Repository model = App.getRepo(); if(model.inActiveMatch()) { showHUD(); } schedulePendingMatchStartTimeAlarms(); super.onViewCreated(view, savedInstanceState); } private boolean hudIsShowing() { return getActivity().getSupportFragmentManager() .findFragmentByTag(HUD_FRAGMENT) != null; } private void showHUD() { if(!hudIsShowing()) { hudFragment = new HUDFragment_(); hudFragment.setBearingProvider(bearingSource); getSherlockActivity() .getSupportFragmentManager() .beginTransaction() .add(R.id.game_fragment_container, hudFragment, HUD_FRAGMENT) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .commit(); } } private void hideHUD() { if(hudIsShowing()) { getSherlockActivity().getSupportFragmentManager() .beginTransaction() .remove(hudFragment) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .commit(); } } public void schedulePendingMatchStartTimeAlarms() { Context context = getActivity(); Repository model = App.getRepo(); List<Match> matches = model.getPendingMatches(); if(matches != null) { for (Match m : matches) { Log.d(TAG, "schedulingMatchStartTimeAlarm() " + m.startTime); AlarmManager alarmMngr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); //if the match has already begun, it will fire immediately alarmMngr.set(AlarmManager.RTC_WAKEUP, m.startTime, PendingIntent.getBroadcast(context, 0, new Intent(PushNotifications.MATCH_START).putExtra("match_id", m.id), PendingIntent.FLAG_UPDATE_CURRENT)); } } } @Override public void onPause() { unregisterReceivers(); super.onPause(); } @Override public void onResume() { bearingSource = new BearingProviderImpl(getActivity()); mapFragment.setBearingProvider(bearingSource); //TODO: the bearing is messed up, fix bearing first //if(hudFragment != null) hudFragment.setBearingProvider(bearingSource); registerReceivers(); super.onResume(); } @Click(R.id.toggle_compass) public void onToggleCompass() { mapFragment.toggleCompassMode(); toggleCompass.setImageResource( mapFragment.getCompassMode() == MapFragment.MODE_BEARING ? R.drawable.north : R.drawable.compass); } public void onTargetRangeChanged(String tRange) { if(hudIsShowing()) hudFragment.onTargetRangeChanged(tRange); if(tRange != null && (tRange.equals(PlayerModel.HUNT_RANGE) || tRange.equals(PlayerModel.ATTACK_RANGE))) { Repository model = App.getRepo(); Player p = model.getMyFocusedPlayer(); mapFragment.showTargetLocation(p.getTargetLatLng()); } else { mapFragment.hideTargetLocation(); } } public void onEnemyRangeChanged(String eRange) { if(hudIsShowing()) hudFragment.onEnemyRangeChanged(eRange); } public void onTargetBearingChanged(Float tBearing) { mapFragment.onTargetBearingChanged(tBearing); if(hudIsShowing()) hudFragment.onTargetBearingChanged(tBearing); } public void onTargetLifeChanged(Integer tLife) { if(hudIsShowing()) hudFragment.onTargetLifeChanged(tLife); } public void onMyLifeChanged(Integer life) { if(hudIsShowing()) hudFragment.onMyLifeChanged(life); } public void updatePlayer(Player player) { onTargetBearingChanged(player.targetBearing); mapFragment.onTargetLocationChanged(player.getTargetLatLng()); onTargetLifeChanged(player.targetHealth); onTargetRangeChanged(player.targetRange); onMyLifeChanged(player.health); onEnemyRangeChanged(player.enemyRange); } public void onLocationChanged(LatLng location) { mapFragment.onLocationChanged(location); } private BroadcastReceiver focusedGameChanged = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Repository model = App.getRepo(); Player p = model.getMyFocusedPlayer(); Match m = model.getFocusedMatch(); initIntentFilters(p); initMapFragment(); if(m.startTime != null && m.startTime > System.currentTimeMillis() && m.endTime == null) { showHUD(); } else { hideHUD(); } updatePlayer(p != null ? p : new Player()); } }; private BroadcastReceiver userRcvr = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Repository model = App.getRepo(); User user = model.getUser(); if(action.equals(LocationService.LOCATION_UPDATED)) { if(model.inActiveMatch()) { initIntentFilters(model.getMyFocusedPlayer()); } onLocationChanged(user.getLocation()); } else if(action.equals(User.LOGOUT_COMPLETE)) { hideHUD(); mapFragment.onMatchEnd(); } } }; private BroadcastReceiver focusedPlayerRcvr = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.d(TAG, "broadcast received [" + action + "]"); Player player = PlayerMapper.fromExtras(intent.getExtras()); updatePlayer(player); } }; private BroadcastReceiver focusedGameRcvr = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.d(TAG, "broadcast received [" + action + "]"); Repository model = App.getRepo(); User user = model.getUser(); Match m = MatchMapper.fromExtras(intent.getExtras()); if(m.winner != null) { String winner = m.winner; hideHUD(); if(m.winner.equals(user.getUsername())) { winner = "you"; } Toast.makeText(context, "The hunt is over. " + winner + " won.", Toast.LENGTH_LONG).show(); mapFragment.onMatchEnd(); } } }; }