package ca.josephroque.bowlingcompanion.dialog;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.text.InputFilter;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import ca.josephroque.bowlingcompanion.R;
/**
* Created by Joseph Roque on 15-03-19. Provides a dialog and a callback interface {@link
* ManualScoreDialog.ManualScoreDialogListener} for the user to enter a score for a game manually. The purpose is to
* allow them to include a game in their statistics, without requiring that they insert every game frame-by-frame.
*/
public class ManualScoreDialog
extends DialogFragment {
/** Identifies output from this class in Logcat. */
@SuppressWarnings("unused")
private static final String TAG = "ManualScoreDialog";
/** Maximum number of characters in a bowling score. */
private static final byte MAX_SCORE_LENGTH = 3;
/** Instance of callback listener. */
private ManualScoreDialogListener mDialogListener;
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getContext());
final View dialogView = View.inflate(getContext(), R.layout.dialog_set_score, null);
final EditText editTextScore = (EditText) dialogView.findViewById(R.id.et_score);
editTextScore.setHint("Score (max 450)");
editTextScore.setFilters(new InputFilter[]{new InputFilter.LengthFilter(MAX_SCORE_LENGTH)});
if (savedInstanceState != null)
editTextScore.setText(savedInstanceState.getCharSequence("GameScore"));
dialogBuilder.setView(dialogView)
.setPositiveButton(R.string.dialog_okay, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (editTextScore.length() > 0) {
short gameScore;
try {
gameScore = Short.parseShort(editTextScore.getText().toString());
} catch (NumberFormatException ex) {
gameScore = -1;
}
mDialogListener.onSetScore(gameScore);
}
dialog.dismiss();
}
})
.setNegativeButton(R.string.dialog_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog dialog = dialogBuilder.create();
Window dialogWindow = dialog.getWindow();
if (dialogWindow != null) {
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
return dialog;
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putCharSequence("GameScore",
((EditText) getDialog().findViewById(R.id.et_score)).getText());
}
/**
* Callback interface which executes methods in activity upon user interaction.
*/
public interface ManualScoreDialogListener {
/**
* Invoked when user opts to submit a manual score.
*
* @param gameScore score input from user
*/
void onSetScore(short gameScore);
}
/**
* Creates a new instance of ManualScoreDialog, sets listener member variable and returns the new instance.
*
* @param listener instance of callback interface
* @return new instance of ManualScoreDialog
*/
public static ManualScoreDialog newInstance(ManualScoreDialogListener listener) {
ManualScoreDialog dialogFragment = new ManualScoreDialog();
dialogFragment.mDialogListener = listener;
return dialogFragment;
}
}