Click here to Skip to main content
15,891,943 members
Articles / Mobile Apps / Android

Android Puzzles Solver

Rate me:
Please Sign up or sign in to vote.
4.87/5 (17 votes)
1 Oct 2012Apache13 min read 102.8K   7.1K   77  
Puzzles Solver is an Android application for playing and solving puzzles.
package gr.sullenart.games.puzzles.gameengine.solo;

import gr.sullenart.games.puzzles.R;
import gr.sullenart.games.puzzles.gameengine.solo.SoloGame.SoloGameType;

import java.util.List;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;

public class SoloBoardsListActivity extends ListActivity {

	static final int DIALOG_CHOICES_ID = 0;
	static final int DIALOG_BOARD_SETTINGS_ID = 1;
	static final int DIALOG_ERROR_ALERT_ID = 2;
	
	private SoloPuzzleRepository puzzleRepository;

	private Dialog choicesDialog;

	private String boardSelected;
	
	private ArrayAdapter<String> arrayAdapter;
	
	private List<String> boards;
	
	private Dialog boardSettingsDialog;
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        ListView lv = getListView();
        lv.setTextFilterEnabled(true);

        lv.setOnItemClickListener(new OnItemClickListener() {
        	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        	  	if (position < 1) {
					showDialog(DIALOG_BOARD_SETTINGS_ID);      		  
        	  	}
        	  	else {
        	  		boardSelected = ((TextView) view).getText().toString();
        	  		removeDialog(DIALOG_CHOICES_ID);
        	  		showDialog(DIALOG_CHOICES_ID);
        	  	}
          	}
        });
	}
	
    @Override
    public void onStart() {
    	super.onStart();
    	puzzleRepository = new SoloPuzzleRepository(getApplicationContext());
        updateList();
    }
	
	private void updateList() {
        boards = puzzleRepository.getCustomBoardNames();
        boards.add(0, "-- " + getResources().getString(R.string.new_board) + " --");
        arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 
        										boards);
        setListAdapter(arrayAdapter);		
	}
	
    @Override
    protected Dialog onCreateDialog(int id) {
        Dialog dialog;
        switch(id) {
        case DIALOG_CHOICES_ID:
        	dialog = createChoicesDialog();
            break;
        case DIALOG_BOARD_SETTINGS_ID:
        	dialog = createBoardSettingsDialog();
        	break;            
        case DIALOG_ERROR_ALERT_ID:
        	dialog = createErrorAlertDialog();
        	break;
        default:
            dialog = null;
        }

        return dialog;
    }
    
    private Dialog createErrorAlertDialog() {
    	AlertDialog.Builder builder = new AlertDialog.Builder(this);
    	builder.setMessage(R.string.an_error_occurred)
    	       .setCancelable(false)
    	       .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    	           public void onClick(DialogInterface dialog, int id) {
    	        	   finish();
    	           }
    	       });
    	AlertDialog alert = builder.create();
    	return alert;    	
    }
    
    private Dialog createChoicesDialog() {
        choicesDialog = new Dialog(this);
        choicesDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        choicesDialog.setContentView(R.layout.edit_board);

        Button closeButton = (Button) choicesDialog.findViewById(R.id.close_edit_board);
        final Button editButton = (Button) choicesDialog.findViewById(R.id.edit_board_button);
        final Button deleteButton = (Button) choicesDialog.findViewById(R.id.delete_board_button);
        final Button renameButton = (Button) choicesDialog.findViewById(R.id.rename_board_button);
        Button deleteOkButton = (Button) choicesDialog.findViewById(R.id.delete_board_ok_button);
        Button deleteCancelButton = (Button) choicesDialog.findViewById(R.id.delete_board_cancel_button);        
        Button renameOkButton = (Button) choicesDialog.findViewById(R.id.rename_board_ok_button);
        Button renameCancelButton = (Button) choicesDialog.findViewById(R.id.rename_board_cancel_button);
        
        ((TextView) choicesDialog.findViewById(R.id.board_name_text)).setText(boardSelected);
        ((EditText) choicesDialog.findViewById(R.id.board_new_name)).setText(boardSelected);
        
        closeButton.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View arg0) {
						choicesDialog.dismiss();
					}
        		});

        editButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {

				SoloCustomBoardActivity.showDirections = true;
				Intent addIntent  = new Intent("gr.sullenart.games.puzzles.SOLO_ADD_BOARD");
				SoloGame soloGame = puzzleRepository.getGame(boardSelected);
				int [] board = soloGame.getBoard();
				addIntent.putExtra("boardName", boardSelected);
				addIntent.putExtra("board", board);
				addIntent.putExtra("targetPosition", soloGame.getTargetPosition());
				addIntent.putExtra("boardType", soloGame.getType().getCode());
				addIntent.putExtra("boardSize", Solo.GET_BOARD_SIZE(board));
				startActivity(addIntent);
				
				choicesDialog.dismiss();
			}
		});
        
        deleteButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				editButton.setEnabled(false);
				renameButton.setEnabled(false);
				choicesDialog.findViewById(R.id.delete_confirm_toolbar).setVisibility(View.VISIBLE);
			}
		});
        
        deleteOkButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				choicesDialog.dismiss();
				if (!puzzleRepository.deleteGame(boardSelected)) {
					showDialog(DIALOG_ERROR_ALERT_ID);
				}
				else {
					//boards.remove(boardSelected);
					arrayAdapter.notifyDataSetChanged();
				}
			}
		});  
        
        deleteCancelButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				editButton.setEnabled(true);
				renameButton.setEnabled(true);
				choicesDialog.findViewById(R.id.delete_confirm_toolbar).setVisibility(View.GONE);
			}
		});          
        
        renameButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				editButton.setEnabled(false);
				deleteButton.setEnabled(false);				
				choicesDialog.findViewById(R.id.rename_toolbar).setVisibility(View.VISIBLE);
			}
		});
        
        renameOkButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				String newName = 
					((EditText) choicesDialog.findViewById(R.id.board_new_name)).getText().toString();
				if (puzzleRepository.nameExists(newName)) {
					choicesDialog.findViewById(R.id.new_name_exists_message).setVisibility(View.VISIBLE);
				}
				else {
					choicesDialog.dismiss();
					if (!puzzleRepository.renameGame(boardSelected, newName)) {
						showDialog(DIALOG_ERROR_ALERT_ID);
					}
					else {
						//int pos = boards.indexOf(boardSelected);
						//boards.set(pos, newName);
						arrayAdapter.notifyDataSetChanged();
					}
				}
			}
		}); 
        
        renameCancelButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				editButton.setEnabled(true);
				deleteButton.setEnabled(true);
				choicesDialog.findViewById(R.id.new_name_exists_message).setVisibility(View.GONE);
				choicesDialog.findViewById(R.id.rename_toolbar).setVisibility(View.GONE);
			}
		});         
        return choicesDialog;
    }
    
    private Dialog createBoardSettingsDialog() {
		boardSettingsDialog = new Dialog(this);
		boardSettingsDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
		boardSettingsDialog.setContentView(R.layout.board_settings);
		
		Button okButton = (Button) 
			boardSettingsDialog.findViewById(R.id.new_board_ok_button);
		Button cancelButton = (Button) 
			boardSettingsDialog.findViewById(R.id.new_board_cancel_button);

		final Spinner typeSpinner = (Spinner)
			boardSettingsDialog.findViewById(R.id.board_type_spinner);
		
		final Spinner sizeSpinner = (Spinner)
			boardSettingsDialog.findViewById(R.id.board_size_spinner);		
		
		final CheckBox targetPositionCheckBox = (CheckBox)
			boardSettingsDialog.findViewById(R.id.target_position_check);
		
		okButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				int size = 5 + sizeSpinner.getSelectedItemPosition();
				int typeCode = typeSpinner.getSelectedItemPosition();
				boolean hasTargetPosition = targetPositionCheckBox.isChecked();
				int [] board = null;
				int targetPosition = -1;
				
				switch (SoloGameType.getGameType(typeCode)) {
				case SQUARE:
				case SQUARE_DIAGONAL:
					board = puzzleRepository.getDefaultSquareBoard(size);
					if (hasTargetPosition) {
						targetPosition = 
							puzzleRepository.getDefaultSquareTargetPosition(size);
					}
					break;
				case TRIANGULAR:
					board = puzzleRepository.getDefaultTriangularBoard(size);
					if (hasTargetPosition) {
						targetPosition = 
							puzzleRepository.getDefaultTriangularTargetPosition(size);
					}					
					break;
				}
				SoloCustomBoardActivity.showDirections = true;				
				Intent addIntent  = new Intent("gr.sullenart.games.puzzles.SOLO_ADD_BOARD");
				addIntent.putExtra("boardName", "");
				addIntent.putExtra("board", board);
				addIntent.putExtra("targetPosition", targetPosition);
				addIntent.putExtra("boardType", typeCode);
				addIntent.putExtra("boardSize", size);
				startActivity(addIntent);
				
				boardSettingsDialog.dismiss();
			}
		});
        
		cancelButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				boardSettingsDialog.dismiss();
			}
		});        
		return boardSettingsDialog;
	}    

}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Apache License, Version 2.0


Written By
Software Developer (Senior) Self employed
Greece Greece
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions