package com.nbs.client.assassins.views; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import android.content.Context; import android.os.Bundle; import android.os.CountDownTimer; import android.util.Log; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragment; import com.googlecode.androidannotations.annotations.AfterInject; import com.googlecode.androidannotations.annotations.AfterViews; import com.googlecode.androidannotations.annotations.Background; import com.googlecode.androidannotations.annotations.Click; import com.googlecode.androidannotations.annotations.EFragment; import com.googlecode.androidannotations.annotations.UiThread; import com.googlecode.androidannotations.annotations.ViewById; import com.googlecode.androidannotations.annotations.rest.RestService; 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.Player; 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.network.AttackResponse; import com.nbs.client.assassins.network.HuntedRestClient; import com.nbs.client.assassins.network.UpdateLocationRequest; import com.nbs.client.assassins.sensors.BearingProvider; import com.nbs.client.assassins.sensors.BearingReceiver; @EFragment(R.layout.hud) public class HUDFragment extends SherlockFragment implements BearingReceiver { private static final String TAG = "HUDFragment"; private CountDownTimer escapeTimer; @RestService HuntedRestClient restClient; @ViewById(R.id.hud_tbearing) TextView tBearingView; @ViewById(R.id.hud_target_life) ProgressBar tLifeView; @ViewById(R.id.hud_my_life) ProgressBar lifeView; private BearingProvider bearingProvider; @ViewById(R.id.hud_attack) TextView attackButton; @ViewById(R.id.hud_escape_time_remaining) TextView escapeTimeText; @ViewById(R.id.hud_trange) TextView targetRange; @ViewById(R.id.hud_erange) TextView enemyRange; public HUDFragment() {} @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate()"); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Log.d(TAG, "onViewCreate()"); } @AfterViews public void refreshHUDData() { Log.d(TAG, "refreshHUDData()"); Repository model = App.getRepo(); Player p = model.getMyFocusedPlayer(); String tRange = p.targetRange; String eRange = p.enemyRange; Integer myLife = p.health; Integer tLife = p.targetHealth; targetRange.setText(getRangeString(tRange)); enemyRange.setText(getRangeString(eRange)); lifeView.setProgress((myLife != null ? myLife : 0)); tLifeView.setProgress((tLife != null ? tLife : 0)); initAttackState(tRange); } @Override public void onPause() { stopSensorUpdates(); if(escapeTimer != null) escapeTimer.cancel(); super.onPause(); } @Override public void onResume() { registerForSensorUpdates(); refreshHUDData(); super.onResume(); } private void initAttackState(String targetRange) { Log.d(TAG, "initAttackState("+targetRange+")"); long escapeTimeRemaining = getRemainingEscapeTime(); if(targetRange != null && escapeTimeRemaining == 0) { setAttackEnabled(targetRange.equals(PlayerModel.ATTACK_RANGE)); } else { setAttackEnabled(false); initEscapeTimer(escapeTimeRemaining); } } public long getRemainingEscapeTime() { Repository model = App.getRepo(); Match match = model.getFocusedMatch(); Player player = model.getMyFocusedPlayer(); if(match.escapeTime == null || player.lastAttackTime == null) return 0; else return (long)Math.floor(((player.lastAttackTime/1000) + match.escapeTime) - (System.currentTimeMillis()/1000)); } private void initEscapeTimer(long seconds) { if(escapeTimer != null) escapeTimer.cancel(); if(seconds > 0) { Log.d(TAG, "starting escape time countdown: "+ seconds + "s"); escapeTimer = new CountDownTimer(seconds*1000, 1000/*tick time in millis*/) { public void onTick(long millisUntilFinished) { onEscapeTimeChanged(millisUntilFinished); } public void onFinish() { onEscapeTimeChanged(0); } }.start(); } } private void stopSensorUpdates() { //if(bearingProvider != null) bearingProvider.unregisterForBearingUpdates(this); } private void registerForSensorUpdates() { //if(bearingProvider != null) bearingProvider.registerForBearingUpdates(this); } @Override public void setBearingProvider(BearingProvider provider) { bearingProvider = provider; } private void setAttackEnabled(boolean enabled) { attackButton.setEnabled(enabled); if(enabled) { attackButton.setTextColor(getResources().getColor(R.color.white)); } else { attackButton.setTextColor(getResources().getColor(R.color.DarkGray)); } } @Override public void onBearingChanged(Float bearing) { Log.d(TAG, Float.toString(bearing)); } public void onTargetBearingChanged(Float tBearing) { Log.d(TAG, "onTargetBearingChanged("+tBearing+")"); if(tBearing != null) tBearingView.setText(Float.toString(tBearing)); } public void onMyLifeChanged(Integer life) { if(life != null) lifeView.setProgress(life); } public void onTargetLifeChanged(Integer tLife) { if(tLife != null) tLifeView.setProgress(tLife); } public void onTargetRangeChanged(String tRange) { targetRange.setText(getRangeString(tRange)); initAttackState(tRange); } public void onEnemyRangeChanged(String eRange) { enemyRange.setText(getRangeString(eRange)); } private static String getRangeString(String range) { if(range == null) { return "?"; } else if(range.equals(PlayerModel.ATTACK_RANGE)) return "ATTACK"; else if (range.equals(PlayerModel.HUNT_RANGE)) return "HUNT"; else { return range; } } private void onEscapeTimeChanged(long escapeTimeRemaining) { Log.d(TAG, "onEscapeTimeChanged("+escapeTimeRemaining+")"); if(escapeTimeRemaining > 1000) { escapeTimeText.setText(escapeTimeRemaining/1000+" s"); } else { escapeTimeText.setText(""); setAttackEnabled(true); } } @Click(R.id.hud_attack) public void onAttackClicked() { setAttackEnabled(false); attack(); } @Background public void attack() { Log.d(TAG, "attack()"); Context c = getSherlockActivity(); AttackResponse response = null; Repository model = App.getRepo(); User user = model.getUser(); Player player = model.getMyFocusedPlayer(); try { response = restClient.attack(user.getFocusedMatch(), user.getToken(), new UpdateLocationRequest(user.getLocation(), user.getInstallId())); if(response != null && response.hit) { player.setLastSuccessfulAttackTime(System.currentTimeMillis()); } } catch(Exception e) { Log.d(TAG, e.getMessage()); } attackFinished(response); } @UiThread public void attackFinished(AttackResponse response) { Log.d(TAG, "attackFinished(" + response + ")"); if(response != null && response.ok()) { Toast.makeText(getSherlockActivity(), response.message, Toast.LENGTH_SHORT).show(); if(response.player != null) { if(response.player.targetHealth > 0) { Repository model = ((App)(getActivity().getApplication())).getRepo(); model.updatePlayer(response.player); initEscapeTimer(getRemainingEscapeTime()); } } } } @AfterInject public void afterInjection() { //subvert a bug in HttpUrlConnection //see: http://www.sapandiwakar.in/technical/eofexception-with-spring-rest-template-android/ restClient.getRestTemplate().setRequestFactory( new HttpComponentsClientHttpRequestFactory()); } }