package de.nisble.droidsweeper.gui;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.NumberPicker;
import android.widget.ScrollView;
import android.widget.Spinner;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.NumberPicker.OnValueChangeListener;
import de.nisble.droidsweeper.R;
import static de.nisble.droidsweeper.config.Constants.*;
import de.nisble.droidsweeper.config.GameConfig;
import de.nisble.droidsweeper.config.Level;
import de.nisble.droidsweeper.config.ApplicationConfig;
import de.nisble.droidsweeper.utilities.LogDog;
/** Settings activity.
* @author Moritz Nisblé moritz.nisble@gmx.de */
public class SettingsActivity extends Activity {
private static final String CLASSNAME = SettingsActivity.class.getSimpleName();
private ScrollView mScrollGameSettings;
private Spinner mSpinDifficulty;
private NumberPicker mNpWidth;
private NumberPicker mNpHeight;
private NumberPicker mNpBombs;
private CheckBox mCbShowReplayOnLost;
private GameConfig mPassedConfig = null;
private GameConfig mCurrentConfig = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TODO: Use constant!
mPassedConfig = getIntent().getParcelableExtra("GameConfig");
if (null == mPassedConfig) {
LogDog.e(CLASSNAME, "Unable to unpack GameConfig from intent");
mPassedConfig = new GameConfig(Level.EASY);
}
mCurrentConfig = mPassedConfig;
LogDog.i(CLASSNAME, "Passed GameConfig: " + mPassedConfig.toString());
setContentView(R.layout.layout_gamesettings);
mScrollGameSettings = (ScrollView) findViewById(R.id.scrollGameSettings);
mSpinDifficulty = (Spinner) findViewById(R.id.spinner_difficulty);
mNpWidth = (NumberPicker) findViewById(R.id.npWidth);
mNpHeight = (NumberPicker) findViewById(R.id.npHeight);
mNpBombs = (NumberPicker) findViewById(R.id.npBombs);
mCbShowReplayOnLost = (CheckBox) findViewById(R.id.cbShowReplayOnLost);
mSpinDifficulty.setSelection(mPassedConfig.LEVEL.ordinal());
// TODO: Get values from Constants!
mNpWidth.setMinValue(1);
mNpWidth.setMaxValue(20);
mNpHeight.setMinValue(1);
mNpHeight.setMaxValue(20);
mNpBombs.setMinValue(1);
mNpBombs.setMaxValue((int) (mNpWidth.getValue() * mNpHeight.getValue() * 0.9));
mCbShowReplayOnLost.setChecked(ApplicationConfig.INSTANCE.isReplayOnLost());
mCbShowReplayOnLost.setOnCheckedChangeListener(onShowOnLostCheckedChanged);
mNpWidth.setOnTouchListener(onNumberPickerTouchListener);
mNpHeight.setOnTouchListener(onNumberPickerTouchListener);
mNpBombs.setOnTouchListener(onNumberPickerTouchListener);
mSpinDifficulty.setOnItemSelectedListener(onSpinnerItemSelected);
mNpWidth.setOnValueChangedListener(onValueChanged);
mNpHeight.setOnValueChangedListener(onValueChanged);
}
@Override
public void onBackPressed() {
Level level = Level.fromInt((int) mSpinDifficulty.getSelectedItemId());
if (Level.CUSTOM == level) {
mCurrentConfig = new GameConfig(mNpWidth.getValue(), mNpHeight.getValue(), mNpBombs.getValue());
} else {
mCurrentConfig = new GameConfig(level);
}
if (mCurrentConfig.equals(mPassedConfig)) {
setResult(RESULT_CANCELED);
} else {
// Bundle b = new Bundle();
// b.putParcelable("GameConfig", mCurrentConfig);
// getIntent().replaceExtras(b);
getIntent().removeExtra("GameConfig");
getIntent().putExtra("GameConfig", mCurrentConfig);
LogDog.i(CLASSNAME, "GameConfig changed: " + mCurrentConfig.toString());
setResult(INTENTRESULT_CHANGE_GAMECONFIG, getIntent());
}
finish();
}
/* This is directly called after onCreate for the selection made for the
* mPassedConfig */
private AdapterView.OnItemSelectedListener onSpinnerItemSelected = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// Get the selected level
Level level = Level.fromInt((int) id);
if (Level.CUSTOM == level) {
/* Custom level */
mNpWidth.setEnabled(true);
mNpHeight.setEnabled(true);
mNpBombs.setEnabled(true);
mCurrentConfig = new GameConfig(mCurrentConfig.X, mCurrentConfig.Y, mCurrentConfig.BOMBS);
} else {
/* Standard level */
mNpWidth.setEnabled(false);
mNpHeight.setEnabled(false);
mNpBombs.setEnabled(false);
mCurrentConfig = new GameConfig(level);
}
mNpWidth.setValue(mCurrentConfig.X);
mNpHeight.setValue(mCurrentConfig.Y);
mNpBombs.setMaxValue((int) (mCurrentConfig.X * mCurrentConfig.Y * 0.9));
mNpBombs.setValue(mCurrentConfig.BOMBS);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
};
private OnValueChangeListener onValueChanged = new OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mNpBombs.setMaxValue((int) (mNpWidth.getValue() * mNpHeight.getValue() * 0.9));
}
};
private View.OnTouchListener onNumberPickerTouchListener = new View.OnTouchListener() {
// TODO: Check this warning!
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_MOVE) {
/* This prevents scrolling of the underling scroll view,
* when a move is detected on the NumberPicker! */
mScrollGameSettings.requestDisallowInterceptTouchEvent(true);
}
return false;
}
};
protected OnCheckedChangeListener onShowOnLostCheckedChanged = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
ApplicationConfig.INSTANCE.setShowReplayOnLost(isChecked);
}
};
}