package com.mediamonks.googleflip.pages.calibration; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.CountDownTimer; import android.view.View; import com.badlogic.gdx.math.Vector2; import com.mediamonks.googleflip.GoogleFlipGameApplication; import com.mediamonks.googleflip.R; import com.mediamonks.googleflip.data.constants.IntentKeys; import com.mediamonks.googleflip.data.constants.PrefKeys; import com.mediamonks.googleflip.pages.game.physics.constants.Physics; import com.mediamonks.googleflip.pages.home.HomeActivity; import com.mediamonks.googleflip.ui.RegisteredFragmentActivity; import com.mediamonks.googleflip.util.ScreenUtil; import com.mediamonks.googleflip.util.SoundManager; import com.pixplicity.easyprefs.library.Prefs; import org.andengine.extension.physics.box2d.util.Vector2Pool; import org.hitlabnz.sensor_fusion_demo.orientationProvider.OrientationProvider; import org.hitlabnz.sensor_fusion_demo.representation.EulerAngles; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import temple.core.ui.CustomButton; import temple.core.ui.CustomTextView; import temple.core.utils.AlertUtils; /** * Activity for calibrating the phone's physics sensors */ public class CalibrationActivity extends RegisteredFragmentActivity { private static final String TAG = CalibrationActivity.class.getSimpleName(); @Bind(R.id.btn_start_calibration) protected CustomButton _startCalibrationButton; @Bind(R.id.tv_calibration_countdown) protected CustomTextView _calibrationCountdownText; private CountDownTimer _countdownTimer; private CountDownTimer _calibrationTimer; private List<Vector2> _gravityPoints = new ArrayList<>(); private int _currentSeconds; private OrientationProvider _orientationProvider; private float _radToGravity = (float) (Physics.GRAVITY_FACTOR / Math.PI); private String _fromActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_calibration); ButterKnife.bind(this); ScreenUtil.setFullScreen(getWindow().getDecorView()); Bundle extras = getIntent().getExtras(); if (extras != null) { _fromActivity = extras.getString(IntentKeys.FROM); } _orientationProvider = GoogleFlipGameApplication.getOrientationProvider(this); if (_orientationProvider != null) { try { _orientationProvider.start(); } catch (Exception e) { // AlertUtils.showAlert(this, R.string.no_sensor_found_message, R.string.no_sensor_found_title, R.string.btn_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Prefs.putFloat(PrefKeys.CALIBRATION_X, 0); Prefs.putFloat(PrefKeys.CALIBRATION_Y, 0); startActivity(new Intent(CalibrationActivity.this, HomeActivity.class)); } }); } } _radToGravity = (float) (Prefs.getFloat(PrefKeys.GRAVITY_FACTOR, Physics.GRAVITY_FACTOR) / Math.PI); } @Override protected void onResume() { super.onResume(); } @OnClick(R.id.btn_start_calibration) protected void onStartClick() { SoundManager.getInstance().play(R.raw.tap); _startCalibrationButton.setVisibility(View.INVISIBLE); _calibrationCountdownText.setText(getString(R.string.calibration_countdown, 3)); _countdownTimer = new CountDownTimer(3100, 500) { @Override public void onTick(long millisUntilFinished) { int seconds = Math.min(1 + (int) (millisUntilFinished / 1000), 3); _calibrationCountdownText.setText(getString(R.string.calibration_countdown, seconds)); } @Override public void onFinish() { _countdownTimer.cancel(); _countdownTimer = null; startCalibration(); } }.start(); } private void startCalibration() { _currentSeconds = 4; // record gravity every 50 ms _calibrationTimer = new CountDownTimer(3100, 50) { @Override public void onTick(long millisUntilFinished) { int seconds = Math.min(1 + (int) (millisUntilFinished / 1000), 3); if (seconds != _currentSeconds) { _currentSeconds = seconds; _calibrationCountdownText.setText(getString(R.string.calibration_running, seconds)); } recordGravity(); } @Override public void onFinish() { _calibrationTimer.cancel(); _calibrationTimer = null; calculateAverageGravity(); if (_fromActivity.equals(HomeActivity.class.getSimpleName())) { startActivity(new Intent(CalibrationActivity.this, HomeActivity.class)); } else { onBackPressed(); ScreenUtil.setFullScreen(getWindow().getDecorView()); } } }.start(); } private void recordGravity() { EulerAngles eulerAngles = _orientationProvider.getEulerAngles(); _gravityPoints.add(Vector2Pool.obtain(_radToGravity * eulerAngles.getRoll(), _radToGravity * eulerAngles.getPitch())); } @Override protected void onPause() { super.onPause(); if (_countdownTimer != null) { _countdownTimer.cancel(); _countdownTimer = null; } if (_calibrationTimer != null) { _calibrationTimer.cancel(); _calibrationTimer = null; } _orientationProvider.stop(); } private void calculateAverageGravity() { Vector2 gravity = Vector2Pool.obtain(); for (int i = 10; i < _gravityPoints.size(); i++) { gravity.add(_gravityPoints.get(i)); } gravity.mul(-1.0f / _gravityPoints.size()); Prefs.putFloat(PrefKeys.CALIBRATION_X, gravity.x); Prefs.putFloat(PrefKeys.CALIBRATION_Y, gravity.y); } }