From 7a793cd44ee4c4f11e4deedb1319a61d0f6b12f2 Mon Sep 17 00:00:00 2001 From: Peter Osterlund Date: Sat, 12 Nov 2011 19:44:02 +0000 Subject: [PATCH] Moved CuckooChessAPK project to trunk/ --- CuckooChessAPK/.classpath | 8 + CuckooChessAPK/.project | 34 ++ CuckooChessAPK/AndroidManifest.xml | 19 + CuckooChessAPK/assets/casefont.ttf | Bin 0 -> 35476 bytes CuckooChessAPK/project.properties | 13 + CuckooChessAPK/res/drawable-hdpi/icon.png | Bin 0 -> 5174 bytes CuckooChessAPK/res/drawable-ldpi/icon.png | Bin 0 -> 2641 bytes CuckooChessAPK/res/drawable-mdpi/icon.png | Bin 0 -> 4087 bytes CuckooChessAPK/res/layout-land/main.xml | 45 +++ CuckooChessAPK/res/layout/main.xml | 40 ++ CuckooChessAPK/res/menu/options_menu.xml | 8 + CuckooChessAPK/res/values/strings.xml | 30 ++ CuckooChessAPK/res/xml/preferences.xml | 33 ++ .../org/petero/cuckoochess/ChessBoard.java | 323 ++++++++++++++++ .../org/petero/cuckoochess/CuckooChess.java | 366 ++++++++++++++++++ .../org/petero/cuckoochess/Preferences.java | 31 ++ 16 files changed, 950 insertions(+) create mode 100644 CuckooChessAPK/.classpath create mode 100644 CuckooChessAPK/.project create mode 100644 CuckooChessAPK/AndroidManifest.xml create mode 100644 CuckooChessAPK/assets/casefont.ttf create mode 100644 CuckooChessAPK/project.properties create mode 100644 CuckooChessAPK/res/drawable-hdpi/icon.png create mode 100644 CuckooChessAPK/res/drawable-ldpi/icon.png create mode 100644 CuckooChessAPK/res/drawable-mdpi/icon.png create mode 100644 CuckooChessAPK/res/layout-land/main.xml create mode 100644 CuckooChessAPK/res/layout/main.xml create mode 100644 CuckooChessAPK/res/menu/options_menu.xml create mode 100644 CuckooChessAPK/res/values/strings.xml create mode 100644 CuckooChessAPK/res/xml/preferences.xml create mode 100644 CuckooChessAPK/src/org/petero/cuckoochess/ChessBoard.java create mode 100644 CuckooChessAPK/src/org/petero/cuckoochess/CuckooChess.java create mode 100644 CuckooChessAPK/src/org/petero/cuckoochess/Preferences.java diff --git a/CuckooChessAPK/.classpath b/CuckooChessAPK/.classpath new file mode 100644 index 0000000..e221cc8 --- /dev/null +++ b/CuckooChessAPK/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/CuckooChessAPK/.project b/CuckooChessAPK/.project new file mode 100644 index 0000000..aadbd11 --- /dev/null +++ b/CuckooChessAPK/.project @@ -0,0 +1,34 @@ + + + CuckooChessAPK + + + CuckooChessEngine + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/CuckooChessAPK/AndroidManifest.xml b/CuckooChessAPK/AndroidManifest.xml new file mode 100644 index 0000000..09afc15 --- /dev/null +++ b/CuckooChessAPK/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + diff --git a/CuckooChessAPK/assets/casefont.ttf b/CuckooChessAPK/assets/casefont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..61c12d6e7256f956e1e00f8f84ab612fe59b3a2c GIT binary patch literal 35476 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 literal 0 HcmV?d00001 diff --git a/CuckooChessAPK/project.properties b/CuckooChessAPK/project.properties new file mode 100644 index 0000000..19f2f1b --- /dev/null +++ b/CuckooChessAPK/project.properties @@ -0,0 +1,13 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Indicates whether an apk should be generated for each density. +split.density=false +# Project target. +target=android-4 diff --git a/CuckooChessAPK/res/drawable-hdpi/icon.png b/CuckooChessAPK/res/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..afb7408af0a92d6cdfd6b7746c2a1e00875d57b0 GIT binary patch literal 5174 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 pg0{PCVo0ZL%4Hvsz2`jb_ + + + + + + + + + + diff --git a/CuckooChessAPK/res/layout/main.xml b/CuckooChessAPK/res/layout/main.xml new file mode 100644 index 0000000..1723648 --- /dev/null +++ b/CuckooChessAPK/res/layout/main.xml @@ -0,0 +1,40 @@ + + + + + + + + + + diff --git a/CuckooChessAPK/res/menu/options_menu.xml b/CuckooChessAPK/res/menu/options_menu.xml new file mode 100644 index 0000000..b12dfe5 --- /dev/null +++ b/CuckooChessAPK/res/menu/options_menu.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/CuckooChessAPK/res/values/strings.xml b/CuckooChessAPK/res/values/strings.xml new file mode 100644 index 0000000..5077822 --- /dev/null +++ b/CuckooChessAPK/res/values/strings.xml @@ -0,0 +1,30 @@ + + + CuckooChess + + Easy + 1s + 5s + 10s + 30s + 60s + + + -1 + 1000 + 5000 + 10000 + 30000 + 60000 + + + Small + Medium + Large + + + 10 + 12 + 16 + + diff --git a/CuckooChessAPK/res/xml/preferences.xml b/CuckooChessAPK/res/xml/preferences.xml new file mode 100644 index 0000000..0f5269d --- /dev/null +++ b/CuckooChessAPK/res/xml/preferences.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + diff --git a/CuckooChessAPK/src/org/petero/cuckoochess/ChessBoard.java b/CuckooChessAPK/src/org/petero/cuckoochess/ChessBoard.java new file mode 100644 index 0000000..ba1535a --- /dev/null +++ b/CuckooChessAPK/src/org/petero/cuckoochess/ChessBoard.java @@ -0,0 +1,323 @@ +/* + CuckooChess - A java chess program. + Copyright (C) 2011 Peter Österlund, peterosterlund2@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +package org.petero.cuckoochess; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import chess.Move; +import chess.Piece; +import chess.Position; + +public class ChessBoard extends View { + private Position pos; + private int selectedSquare; + private float cursorX, cursorY; + private boolean cursorVisible; + private int x0, y0, sqSize; + private boolean flipped; + + private Paint darkPaint; + private Paint brightPaint; + private Paint redOutline; + private Paint greenOutline; + private Paint whitePiecePaint; + private Paint blackPiecePaint; + + public ChessBoard(Context context, AttributeSet attrs) { + super(context, attrs); + pos = new Position(); + selectedSquare = -1; + cursorX = cursorY = 0; + cursorVisible = false; + x0 = y0 = sqSize = 0; + flipped = false; + + darkPaint = new Paint(); + darkPaint.setARGB(255, 128, 128, 128); + + brightPaint = new Paint(); + brightPaint.setARGB(255, 190, 190, 90); + + redOutline = new Paint(); + redOutline.setARGB(255, 255, 0, 0); + redOutline.setStyle(Paint.Style.STROKE); + redOutline.setAntiAlias(true); + + greenOutline = new Paint(); + greenOutline.setARGB(255, 0, 255, 0); + greenOutline.setStyle(Paint.Style.STROKE); + greenOutline.setAntiAlias(true); + + whitePiecePaint = new Paint(); + whitePiecePaint.setARGB(255, 255, 255, 255); + whitePiecePaint.setAntiAlias(true); + + blackPiecePaint = new Paint(); + blackPiecePaint.setARGB(255, 0, 0, 0); + blackPiecePaint.setAntiAlias(true); + } + + public void setFont(Typeface tf) { + whitePiecePaint.setTypeface(tf); + blackPiecePaint.setTypeface(tf); + invalidate(); + } + + /** + * Set the board to a given state. + * @param pos + */ + final public void setPosition(Position pos) { + this.pos = pos; + invalidate(); + } + + /** + * Set/clear the board flipped status. + * @param flipped + */ + final public void setFlipped(boolean flipped) { + this.flipped = flipped; + invalidate(); + } + + /** + * Set/clear the selected square. + * @param square The square to select, or -1 to clear selection. + */ + final public void setSelection(int square) { + if (square != selectedSquare) { + selectedSquare = square; + invalidate(); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = getMeasuredWidth(); + int height = getMeasuredHeight(); + int minSize = Math.min(width, height); + setMeasuredDimension(minSize, minSize); + } + + @Override + protected void onDraw(Canvas canvas) { + final int width = getWidth(); + final int height = getHeight(); + sqSize = (Math.min(width, height) - 4) / 8; + x0 = (width - sqSize * 8) / 2; + y0 = (height - sqSize * 8) / 2; + + for (int x = 0; x < 8; x++) { + for (int y = 0; y < 8; y++) { + final int xCrd = getXCrd(x); + final int yCrd = getYCrd(y); + Paint paint = Position.darkSquare(x, y) ? darkPaint : brightPaint; + canvas.drawRect(xCrd, yCrd, xCrd+sqSize, yCrd+sqSize, paint); + + int sq = Position.getSquare(x, y); + int p = pos.getPiece(sq); + drawPiece(canvas, xCrd + sqSize / 2, yCrd + sqSize / 2, p); + } + } + if (selectedSquare >= 0) { + int selX = Position.getX(selectedSquare); + int selY = Position.getY(selectedSquare); + redOutline.setStrokeWidth(sqSize/(float)16); + int x0 = getXCrd(selX); + int y0 = getYCrd(selY); + canvas.drawRect(x0, y0, x0 + sqSize, y0 + sqSize, redOutline); + } + if (cursorVisible) { + int x = Math.round(cursorX); + int y = Math.round(cursorY); + int x0 = getXCrd(x); + int y0 = getYCrd(y); + greenOutline.setStrokeWidth(sqSize/(float)16); + canvas.drawRect(x0, y0, x0 + sqSize, y0 + sqSize, greenOutline); + } + } + + private final void drawPiece(Canvas canvas, int xCrd, int yCrd, int p) { + String ps; + switch (p) { + case Piece.EMPTY: + ps = ""; + break; + case Piece.WKING: + ps = "k"; + break; + case Piece.WQUEEN: + ps = "q"; + break; + case Piece.WROOK: + ps = "r"; + break; + case Piece.WBISHOP: + ps = "b"; + break; + case Piece.WKNIGHT: + ps = "n"; + break; + case Piece.WPAWN: + ps = "p"; + break; + case Piece.BKING: + ps = "l"; + break; + case Piece.BQUEEN: + ps = "w"; + break; + case Piece.BROOK: + ps = "t"; + break; + case Piece.BBISHOP: + ps = "v"; + break; + case Piece.BKNIGHT: + ps = "m"; + break; + case Piece.BPAWN: + ps = "o"; + break; + default: + ps = "?"; + break; + } + if (ps.length() > 0) { + Paint paint = Piece.isWhite(p) ? whitePiecePaint : blackPiecePaint; + paint.setTextSize(sqSize); + Rect bounds = new Rect(); + paint.getTextBounds(ps, 0, ps.length(), bounds); + int xCent = bounds.centerX(); + int yCent = bounds.centerY(); + canvas.drawText(ps, xCrd - xCent, yCrd - yCent, paint); + } + } + + private final int getXCrd(int x) { + return x0 + sqSize * (flipped ? 7 - x : x); + } + private final int getYCrd(int y) { + return y0 + sqSize * (flipped ? y : (7 - y)); + } + + /** + * Compute the square corresponding to the coordinates of a mouse event. + * @param evt Details about the mouse event. + * @return The square corresponding to the mouse event, or -1 if outside board. + */ + final int eventToSquare(MotionEvent evt) { + int xCrd = (int)(evt.getX()); + int yCrd = (int)(evt.getY()); + + int sq = -1; + if ((xCrd >= x0) && (yCrd >= y0) && (sqSize > 0)) { + int x = (xCrd - x0) / sqSize; + int y = 7 - (yCrd - y0) / sqSize; + if ((x >= 0) && (x < 8) && (y >= 0) && (y < 8)) { + if (flipped) { + x = 7 - x; + y = 7 - y; + } + sq = Position.getSquare(x, y); + } + } + return sq; + } + + final Move mousePressed(int sq) { + if (sq < 0) + return null; + cursorVisible = false; + if (selectedSquare >= 0) { + int p = pos.getPiece(selectedSquare); + if ((p == Piece.EMPTY) || (Piece.isWhite(p) != pos.whiteMove)) { + setSelection(-1); // Remove selection of opponents last moving piece + } + } + + int p = pos.getPiece(sq); + if (selectedSquare >= 0) { + if (sq != selectedSquare) { + if ((p == Piece.EMPTY) || (Piece.isWhite(p) != pos.whiteMove)) { + Move m = new Move(selectedSquare, sq, Piece.EMPTY); + setSelection(sq); + return m; + } + } + setSelection(-1); + } else { + boolean myColor = (p != Piece.EMPTY) && (Piece.isWhite(p) == pos.whiteMove); + if (myColor) { + setSelection(sq); + } + } + return null; + } + + public static class OnTrackballListener { + public void onTrackballEvent(MotionEvent event) { } + } + OnTrackballListener otbl = null; + public void setOnTrackballListener(OnTrackballListener onTrackballListener) { + otbl = onTrackballListener; + } + @Override + public boolean onTrackballEvent(MotionEvent event) { + if (otbl != null) { + otbl.onTrackballEvent(event); + return true; + } + return false; + } + + public Move handleTrackballEvent(MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + invalidate(); + if (cursorVisible) { + int x = Math.round(cursorX); + int y = Math.round(cursorY); + cursorX = x; + cursorY = y; + int sq = Position.getSquare(x, y); + return mousePressed(sq); + } + return null; + } + cursorVisible = true; + int c = flipped ? -1 : 1; + cursorX += c * event.getX(); + cursorY -= c * event.getY(); + if (cursorX < 0) cursorX = 0; + if (cursorX > 7) cursorX = 7; + if (cursorY < 0) cursorY = 0; + if (cursorY > 7) cursorY = 7; + invalidate(); + return null; + } +} diff --git a/CuckooChessAPK/src/org/petero/cuckoochess/CuckooChess.java b/CuckooChessAPK/src/org/petero/cuckoochess/CuckooChess.java new file mode 100644 index 0000000..fdb1dda --- /dev/null +++ b/CuckooChessAPK/src/org/petero/cuckoochess/CuckooChess.java @@ -0,0 +1,366 @@ +/* + CuckooChess - A java chess program. + Copyright (C) 2011 Peter Österlund, peterosterlund2@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +package org.petero.cuckoochess; + +import java.util.ArrayList; +import java.util.List; + +import guibase.ChessController; +import guibase.GUIInterface; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.content.SharedPreferences.OnSharedPreferenceChangeListener; +import android.graphics.Typeface; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.text.ClipboardManager; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnLongClickListener; +import android.view.View.OnTouchListener; +import android.widget.ScrollView; +import android.widget.TextView; +import android.widget.Toast; +import chess.ChessParseError; +import chess.Move; +import chess.Position; +import chess.TextIO; + +public class CuckooChess extends Activity implements GUIInterface { + ChessBoard cb; + ChessController ctrl; + boolean mShowThinking; + int mTimeLimit; + boolean playerWhite; + static final int ttLogSize = 16; // Use 2^ttLogSize hash entries. + + TextView status; + ScrollView moveListScroll; + TextView moveList; + TextView thinking; + + SharedPreferences settings; + + private void readPrefs() { + mShowThinking = settings.getBoolean("showThinking", false); + String timeLimitStr = settings.getString("timeLimit", "5000"); + mTimeLimit = Integer.parseInt(timeLimitStr); + playerWhite = settings.getBoolean("playerWhite", true); + boolean boardFlipped = settings.getBoolean("boardFlipped", false); + cb.setFlipped(boardFlipped); + ctrl.setTimeLimit(); + String fontSizeStr = settings.getString("fontSize", "12"); + int fontSize = Integer.parseInt(fontSizeStr); + status.setTextSize(fontSize); + moveList.setTextSize(fontSize); + thinking.setTextSize(fontSize); + } + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + settings = PreferenceManager.getDefaultSharedPreferences(this); + settings.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() { + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + readPrefs(); + ctrl.setHumanWhite(playerWhite); + } + }); + + setContentView(R.layout.main); + status = (TextView)findViewById(R.id.status); + moveListScroll = (ScrollView)findViewById(R.id.scrollView); + moveList = (TextView)findViewById(R.id.moveList); + thinking = (TextView)findViewById(R.id.thinking); + cb = (ChessBoard)findViewById(R.id.chessboard); + status.setFocusable(false); + moveListScroll.setFocusable(false); + moveList.setFocusable(false); + thinking.setFocusable(false); + ctrl = new ChessController(this); + ctrl.setThreadStackSize(32768); + readPrefs(); + + Typeface chessFont = Typeface.createFromAsset(getAssets(), "casefont.ttf"); + cb.setFont(chessFont); + cb.setFocusable(true); + cb.requestFocus(); + cb.setClickable(true); + + ctrl.newGame(playerWhite, ttLogSize, false); + { + String fen = ""; + String moves = ""; + String numUndo = "0"; + String tmp; + if (savedInstanceState != null) { + tmp = savedInstanceState.getString("startFEN"); + if (tmp != null) fen = tmp; + tmp = savedInstanceState.getString("moves"); + if (tmp != null) moves = tmp; + tmp = savedInstanceState.getString("numUndo"); + if (tmp != null) numUndo = tmp; + } else { + tmp = settings.getString("startFEN", null); + if (tmp != null) fen = tmp; + tmp = settings.getString("moves", null); + if (tmp != null) moves = tmp; + tmp = settings.getString("numUndo", null); + if (tmp != null) numUndo = tmp; + } + List posHistStr = new ArrayList(); + posHistStr.add(fen); + posHistStr.add(moves); + posHistStr.add(numUndo); + ctrl.setPosHistory(posHistStr); + } + ctrl.startGame(); + + cb.setOnTouchListener(new OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + if (ctrl.humansTurn() && (event.getAction() == MotionEvent.ACTION_UP)) { + int sq = cb.eventToSquare(event); + Move m = cb.mousePressed(sq); + if (m != null) { + ctrl.humanMove(m); + } + return false; + } + return false; + } + }); + + cb.setOnTrackballListener(new ChessBoard.OnTrackballListener() { + public void onTrackballEvent(MotionEvent event) { + if (ctrl.humansTurn()) { + Move m = cb.handleTrackballEvent(event); + if (m != null) { + ctrl.humanMove(m); + } + } + } + }); + cb.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (!ctrl.computerThinking()) + showDialog(CLIPBOARD_DIALOG); + return true; + } + }); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + List posHistStr = ctrl.getPosHistory(); + outState.putString("startFEN", posHistStr.get(0)); + outState.putString("moves", posHistStr.get(1)); + outState.putString("numUndo", posHistStr.get(2)); + } + + @Override + protected void onPause() { + List posHistStr = ctrl.getPosHistory(); + Editor editor = settings.edit(); + editor.putString("startFEN", posHistStr.get(0)); + editor.putString("moves", posHistStr.get(1)); + editor.putString("numUndo", posHistStr.get(2)); + editor.commit(); + super.onPause(); + } + + @Override + protected void onDestroy() { + ctrl.stopComputerThinking(); + super.onDestroy(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.options_menu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.item_new_game: + ctrl.newGame(playerWhite, ttLogSize, false); + ctrl.startGame(); + return true; + case R.id.item_undo: + ctrl.takeBackMove(); + return true; + case R.id.item_redo: + ctrl.redoMove(); + return true; + case R.id.item_settings: + { + Intent i = new Intent(CuckooChess.this, Preferences.class); + startActivityForResult(i, 0); + return true; + } + } + return false; + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == 0) { + readPrefs(); + ctrl.setHumanWhite(playerWhite); + } + } + + // FIXME!!! Implement "edit board" + // FIXME!!! Implement analysis mode + + @Override + public void setPosition(Position pos) { + cb.setPosition(pos); + ctrl.setHumanWhite(playerWhite); + } + + @Override + public void setSelection(int sq) { + cb.setSelection(sq); + } + + @Override + public void setStatusString(String str) { + status.setText(str); + } + + @Override + public void setMoveListString(String str) { + moveList.setText(str); + moveListScroll.fullScroll(ScrollView.FOCUS_DOWN); + } + + @Override + public void setThinkingString(String str) { + thinking.setText(str); + } + + @Override + public int timeLimit() { + return mTimeLimit; + } + + @Override + public boolean randomMode() { + return mTimeLimit == -1; + } + + @Override + public boolean showThinking() { + return mShowThinking; + } + + static final int PROMOTE_DIALOG = 0; + static final int CLIPBOARD_DIALOG = 1; + + @Override + protected Dialog onCreateDialog(int id) { + switch (id) { + case PROMOTE_DIALOG: { + final CharSequence[] items = {"Queen", "Rook", "Bishop", "Knight"}; + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Promote pawn to?"); + builder.setItems(items, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + ctrl.reportPromotePiece(item); + } + }); + AlertDialog alert = builder.create(); + return alert; + } + case CLIPBOARD_DIALOG: { + final CharSequence[] items = {"Copy Game", "Copy Position", "Paste"}; + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle("Clipboard"); + builder.setItems(items, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int item) { + switch (item) { + case 0: { + String pgn = ctrl.getPGN(); + ClipboardManager clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE); + clipboard.setText(pgn); + break; + } + case 1: { + String fen = ctrl.getFEN() + "\n"; + ClipboardManager clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE); + clipboard.setText(fen); + break; + } + case 2: { + ClipboardManager clipboard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE); + if (clipboard.hasText()) { + String fenPgn = clipboard.getText().toString(); + try { + ctrl.setFENOrPGN(fenPgn); + } catch (ChessParseError e) { + Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show(); + } + } + break; + } + } + } + }); + AlertDialog alert = builder.create(); + return alert; + } + } + return null; + } + + @Override + public void requestPromotePiece() { + runOnUIThread(new Runnable() { + public void run() { + showDialog(PROMOTE_DIALOG); + } + }); + } + + @Override + public void reportInvalidMove(Move m) { + String msg = String.format("Invalid move %s-%s", TextIO.squareToString(m.from), TextIO.squareToString(m.to)); + Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); + } + + @Override + public void runOnUIThread(Runnable runnable) { + runOnUiThread(runnable); + } +} diff --git a/CuckooChessAPK/src/org/petero/cuckoochess/Preferences.java b/CuckooChessAPK/src/org/petero/cuckoochess/Preferences.java new file mode 100644 index 0000000..90873e9 --- /dev/null +++ b/CuckooChessAPK/src/org/petero/cuckoochess/Preferences.java @@ -0,0 +1,31 @@ +/* + CuckooChess - A java chess program. + Copyright (C) 2011 Peter Österlund, peterosterlund2@gmail.com + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +package org.petero.cuckoochess; + +import android.os.Bundle; +import android.preference.PreferenceActivity; + +public class Preferences extends PreferenceActivity { + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.preferences); + } +}