Android Open Source - android-chess Chess View Puzzle






From Project

Back to project page android-chess.

License

The source code is released under:

MIT License

If you think the Android project android-chess listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package jwtc.android.chess.puzzle;
// w ww .  jav  a2 s .c  om
import jwtc.android.chess.*;

import java.io.InputStream;

import jwtc.chess.*;
import jwtc.chess.board.BoardConstants;
import jwtc.chess.board.BoardMembers;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.*;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.widget.*;
import android.widget.SeekBar.OnSeekBarChangeListener;

/**
 * 
 */
public class ChessViewPuzzle extends UI{
  private ChessViewBase _view;
  private TextView _tvPuzzleText;
  private Button _butPuzzle;
  private ImageView _imgTurn;
  private ImageButton _butPrev, _butNext, _butHelp;
  private ImageView _imgStatus;
  private puzzle _parent;
  private int _iPos;

  private Cursor _cursor = null;
  private int _cnt, _num;
  private SeekBar _seekBar;
  
  protected ContentResolver _cr; 
  
  protected ProgressDialog _progressDlg;
  
   protected Thread _thread;
    protected Handler m_threadHandler = new Handler(){
          /** Gets called on every message that is received */
          // @Override
          public void handleMessage(Message msg) {
            if(msg.what == 1){
              _progressDlg.hide();
              
              getNumPuzzles();
              if(_seekBar != null){
                _seekBar.setMax(_num);
              }
              
              play();
            } else if(msg.what == 2){
              _progressDlg.setMessage(_parent.getString(R.string.msg_progress) + String.format(" %d", (_cnt * 100) / _num) + " %");
            } else if(msg.what == 3){
              _progressDlg.hide();
              _tvPuzzleText.setText("An error occured during install");
            }
          }
          
      };
  
      
  public void getNumPuzzles(){
    
    _cursor = _parent.managedQuery(MyPuzzleProvider.CONTENT_URI_PUZZLES, MyPuzzleProvider.COLUMNS, null, null, "");
    
    if(_cursor != null){
      _num = _cursor.getCount();
    } else {
      _num = 0;
    }
    
    //Cursor countCursor = _cr.query(MyPuzzleProvider.CONTENT_URI_PUZZLES, new String[] {"count(*) AS count"}, null, null, null);
        //countCursor.moveToFirst();
        //_num = countCursor.getInt(0);
  }
      
  public ChessViewPuzzle(final Activity activity) {
    super();
    _parent = (puzzle)activity;
    _view = new ChessViewBase(activity);
    
    _cr = activity.getContentResolver();
    
    _tvPuzzleText = (TextView)_parent.findViewById(R.id.TextViewPuzzleText);
    _imgTurn = (ImageView)_parent.findViewById(R.id.ImageTurn);
    
    _imgStatus = (ImageView)_parent.findViewById(R.id.ImageStatus);
    
    _cnt = 0;
    //_num = 500;
    getNumPuzzles();
    
    _seekBar = (SeekBar)_parent.findViewById(R.id.SeekBarPuzzle);
    if(_seekBar != null){
      _seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener(){
  
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
           if(fromUser){
             _iPos = progress-1;
             play();
           }
        }
  
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
          // TODO Auto-generated method stub
          
        }
  
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
          // TODO Auto-generated method stub
          
        }
        
      });
      
      _seekBar.setMax(_num);
    }    
    
    _iPos = 0;
    
    
    OnClickListener ocl = new OnClickListener() {
          public void onClick(View arg0) {
            handleClick(_view.getIndexOfButton(arg0));
          }
    };
    _view.init(ocl);
    
    _butPuzzle = (Button)_parent.findViewById(R.id.ButtonPuzzle);
    
    _butPuzzle.setOnClickListener(new OnClickListener() {
         public void onClick(View arg0) {
           jumptoMove(_jni.getNumBoard());
           updateState();
          
           //if(_arrPGN.size() == m_game.getBoard().getNumBoard()-1)
          //   _butPuzzle.setText("Next");
           
         }
    });
    
    _butPrev = (ImageButton)_parent.findViewById(R.id.ButtonPuzzlePrevious);
    _butPrev.setOnClickListener(new OnClickListener() {
           public void onClick(View arg0) {
             if(_iPos > 1)
               _iPos-=2;
             play();
           }
    });
    
    _butNext = (ImageButton)_parent.findViewById(R.id.ButtonPuzzleNext);
    _butNext.setOnClickListener(new OnClickListener() {
           public void onClick(View arg0) {
             play();
           }
    });
    
    _butHelp = (ImageButton)_parent.findViewById(R.id.ButtonPuzzleHelp);
    _butHelp.setOnClickListener(new OnClickListener() {
           public void onClick(View arg0) {
               Intent i = new Intent();
            i.setClass(_parent, HtmlActivity.class);
            i.putExtra(HtmlActivity.HELP_MODE, "help_puzzle");
            _parent.startActivity(i); 
           }
    });
    
  }

  // install
  private void processPGN(String s){
    
    if(_cnt % 100 == 0){
      Message msg = new Message();
        msg.what = 2;
        m_threadHandler.sendMessage(msg);
          
      }
    
    ContentValues values;
       values = new ContentValues();
       values.put("PGN", s);
      _cr.insert(MyPuzzleProvider.CONTENT_URI_PUZZLES, values);
      
      _cnt++;
  }
  ///////////////////////////////////////////////////////////////
/*
  private String formatTime(int sec){
      
      return String.format("%d:%02d", (int)(Math.floor(sec/60)), sec % 60);
    } */

  @Override
  public void paintBoard(){

    
    int[] arrSelPositions;
    
    int lastMove = _jni.getMyMove(); 
    if(lastMove != 0){
      arrSelPositions = new int[3];
      arrSelPositions[0] = m_iFrom;
      arrSelPositions[1] = Move.getTo(lastMove);
      arrSelPositions[2] = Move.getFrom(lastMove);
    }
    else{
      arrSelPositions = new int[1];
      arrSelPositions[0] = m_iFrom;
    }
    
    
    _view.paintBoard(_jni, arrSelPositions, null);
    
  }
  public int getPlayMode(){
      return HUMAN_HUMAN;
    }

  public void flipBoard(){
    _view.flipBoard();
    updateState();
  }
  
  
  @Override
  protected boolean requestMove(int from, int to)
  {
    if(_arrPGN.size() <= _jni.getNumBoard()-1){
      setMessage("(position allready solved)");
      return super.requestMove(from, to);
    }
    int move = _arrPGN.get(_jni.getNumBoard()-1)._move;
    int theMove = Move.makeMove(from, to);
    
    if(Move.equalPositions(move, theMove)){
      jumptoMove(_jni.getNumBoard());
      
      updateState();

      setMessage("Correct!");
      _imgStatus.setImageResource(R.drawable.indicator_ok);
      /*
      if(_arrPGN.size() == m_game.getBoard().getNumBoard()-1)
        play();
      else {
        jumptoMove(m_game.getBoard().getNumBoard());
        updateState();
      }*/
      
      return true;
    }
    else
    {
      // check for illegal move
      setMessage("Move " + Move.toDbgString(theMove) + (checkIsLegalMove(from, to) ? " is not the expected move" : " is an invalid move"));
      _imgStatus.setImageResource(R.drawable.indicator_error);
      m_iFrom = -1;
    }
    
    updateState();

    return true;
  }
  
  @Override 
  public void play(){
    m_iFrom = -1;
    Log.i("ChessViewPuzzle", "Numboard = " + _jni.getNumBoard());
        
    _imgStatus.setImageResource(R.drawable.indicator_none);
    
    String sPGN;

    _iPos++;
    if(_iPos < 1)
      _iPos = 1;
    if(_iPos > _num){
      setMessage("You completed all puzzles!!!");
      return;
    }
    
    if(_seekBar != null){
      _seekBar.setProgress(_iPos);
    }
    if(_cursor != null){
      _cursor.moveToPosition(_iPos-1);
      sPGN = _cursor.getString(_cursor.getColumnIndex(MyPuzzleProvider.COL_PGN));
      Log.i("ChessViewPuzzle", "init: " + sPGN);
      loadPGN(sPGN);
      
      jumptoMove(0);
            
      int turn = _jni.getTurn();
      if(turn == BoardConstants.BLACK && false == _view.getFlippedBoard() || 
        turn == BoardConstants.WHITE && _view.getFlippedBoard())
        _view.flipBoard();
      
      String sWhite = _mapPGNHead.get("White");
      if(sWhite == null){
        sWhite = "";
      } else {
        sWhite = sWhite.replace("?", "");        
      }
      String sDate = _mapPGNHead.get("Date");
      if(sDate == null){
        sDate = "";
      } else {
        sDate = sDate.replace("????", "");
        sDate = sDate.replace(".??.??", "");
      }
      
      if(sWhite.length() > 0 && sDate.length() > 0){
        sWhite += ", ";
      }
      
      _tvPuzzleText.setText("# " + _iPos + " - " + sWhite + sDate); // + "\n\n" + _mapPGNHead.get("Event") + ", " + _mapPGNHead.get("Date").replace(".??.??", ""));
      //_tvPuzzle.setText(");
      
      _imgTurn.setImageResource((turn == BoardConstants.WHITE ? R.drawable.turnwhite : R.drawable.turnblack));  
      
      updateState();
    }
  }
  
  
  @Override
  public boolean handleClick(int index)
  {
    
    final int iTo = _view.getFieldIndex(index);
    if(m_iFrom != -1){
      
      if(    _jni.pieceAt(BoardConstants.WHITE, m_iFrom) == BoardConstants.PAWN && 
          BoardMembers.ROW_TURN[BoardConstants.WHITE][m_iFrom] == 6 && 
          BoardMembers.ROW_TURN[BoardConstants.WHITE][iTo] == 7
          ||
          _jni.pieceAt(BoardConstants.BLACK, m_iFrom) == BoardConstants.PAWN && 
          BoardMembers.ROW_TURN[BoardConstants.BLACK][m_iFrom] == 6 &&
          BoardMembers.ROW_TURN[BoardConstants.BLACK][iTo] == 7){
        
        final String[] items = _parent.getResources().getStringArray(R.array.promotionpieces);
        
        AlertDialog.Builder builder = new AlertDialog.Builder(_parent);
        builder.setTitle("Pick promotion piece");
        builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
              dialog.dismiss();
              _jni.setPromo(4 - item);
                boolean bValid = requestMove(m_iFrom, iTo);
            m_iFrom = -1;
            if(false == bValid)
              paintBoard();
            }
        });
        AlertDialog alert = builder.create();
        alert.show();
        return true;
      }
    }
    return super.handleClick(iTo);
  }
  @Override
  public void setMessage(String sMsg)
  {
    _tvPuzzleText.setText(sMsg);
    //_parent.doToast(sMsg);
    //_tvMessage.setText(sMsg);
    //m_textMessage.setText(sMsg);
  }
  @Override
  public void setMessage(int res){
    _tvPuzzleText.setText(res);
    //_parent.doToast(_parent.getString(res));
  }
  
  public void OnPause(SharedPreferences.Editor editor){
    
    editor.putBoolean("flippedBoard", _view.getFlippedBoard());
    if(_iPos > 0)
      editor.putInt("puzzlePos", _iPos-1);
  }
  public void OnResume(final SharedPreferences prefs){
    super.OnResume();
    
    if(prefs.getBoolean("PuzzleShowSeekBar", true)){
      _seekBar.setVisibility(View.VISIBLE);
      
    } else {
      _seekBar.setVisibility(View.GONE);
      
    }
    
    _view.OnResume();
    
    ChessImageView._colorScheme = prefs.getInt("ColorScheme", 0);
    
    _view.setFlippedBoard(prefs.getBoolean("flippedBoard", false));
    
    _iPos = prefs.getInt("puzzlePos", 0);

    getNumPuzzles();
    
    if(_num == 0){

      _num = 500; // first puzzle set has fixed amount
      _progressDlg = ProgressDialog.show(_parent, _parent.getString(R.string.title_installing), _parent.getString(R.string.msg_wait), false, false);
      
      //if(iTmp > 0)
      //  _cr.delete(MyPuzzleProvider.CONTENT_URI_PUZZLES, "1=1", null);
      
      _thread = new Thread(new Runnable(){
            public void run(){
            
              try{
                InputStream is = _parent.getAssets().open("puzzles.pgn");
                
                StringBuffer sb = new StringBuffer();
            String s = "", data; 
            int pos1 = 0, pos2 = 0, len;
            byte[] buffer = new byte[2048];
            
            while((len = is.read(buffer, 0, buffer.length)) != -1){
              data = new String(buffer, 0, len);
              sb.append(data);
              pos1 = sb.indexOf("[Event \"");
              while(pos1 >= 0){
                pos2 = sb.indexOf("[Event \"", pos1+10);
                if(pos2 == -1)
                  break;
                s = sb.substring(pos1, pos2);
                
                processPGN(s);
                
                sb.delete(0, pos2);
                
                pos1 = sb.indexOf("[Event \"");
              }
              //break;
              
              //Log.i("run", "left: " + sb);
              //break;
            }
            processPGN(sb.toString());
            
            Log.i("run", "Count " + _cnt);
            
            Message msg = new Message();
            msg.what = 1;
            m_threadHandler.sendMessage(msg);
              
            is.close();
            
              } catch(Exception ex){
                Log.e("Install", ex.toString());
              }
            }
        });
      _thread.start();
      
      return;
    }    
    
    play();
    
  }  
}




Java Source Code List

jwtc.android.chess.ChessFieldView.java
jwtc.android.chess.ChessImageView.java
jwtc.android.chess.ChessPreferences.java
jwtc.android.chess.ChessViewBase.java
jwtc.android.chess.ChessView.java
jwtc.android.chess.GamesListView.java
jwtc.android.chess.HtmlActivity.java
jwtc.android.chess.ImageCacheObject.java
jwtc.android.chess.MyBaseActivity.java
jwtc.android.chess.MyPGNProvider.java
jwtc.android.chess.PGNView.java
jwtc.android.chess.SaveGameDlg.java
jwtc.android.chess.UI.java
jwtc.android.chess.convergence.Connection.java
jwtc.android.chess.convergence.ConvergenceActivity.java
jwtc.android.chess.convergence.RestServer.java
jwtc.android.chess.iconifiedlist.IconifiedTextListAdapter.java
jwtc.android.chess.iconifiedlist.IconifiedTextView.java
jwtc.android.chess.iconifiedlist.IconifiedText.java
jwtc.android.chess.ics.CustomCommands.java
jwtc.android.chess.ics.ICSChatDlg.java
jwtc.android.chess.ics.ICSChessView.java
jwtc.android.chess.ics.ICSClient.java
jwtc.android.chess.ics.ICSConfirmDlg.java
jwtc.android.chess.ics.ICSMatchDlg.java
jwtc.android.chess.ics.TelnetSocket.java
jwtc.android.chess.ics.TimesealInputStream.java
jwtc.android.chess.ics.TimesealOutputStream.java
jwtc.android.chess.ics.TimesealPipe.java
jwtc.android.chess.ics.TimesealingSocket.java
jwtc.android.chess.puzzle.ChessViewPractice.java
jwtc.android.chess.puzzle.ChessViewPuzzle.java
jwtc.android.chess.puzzle.MyPuzzleProvider.java
jwtc.android.chess.puzzle.practice.java
jwtc.android.chess.puzzle.puzzle.java
jwtc.android.chess.tools.FileListView.java
jwtc.android.chess.tools.PGNProcessor.java
jwtc.android.chess.tools.importactivity.java
jwtc.android.chess.tools.pgntool.java
jwtc.android.chess.main.java
jwtc.android.chess.options.java
jwtc.android.chess.setup.java
jwtc.android.chess.start.java
jwtc.android.timeseal.TimesealingSocket.java
jwtc.android.timeseal.streams.a.java
jwtc.android.timeseal.streams.b.java
jwtc.android.timeseal.streams.c.java
jwtc.chess.ChessPuzzleProvider.java
jwtc.chess.GameControl.java
jwtc.chess.JNI.java
jwtc.chess.Move.java
jwtc.chess.PGNColumns.java
jwtc.chess.PGNEntry.java
jwtc.chess.PGNProvider.java
jwtc.chess.Pos.java
jwtc.chess.Valuation.java
jwtc.chess.algorithm.SearchAlgorithmRunner.java
jwtc.chess.algorithm.UCIWrapper.java
jwtc.chess.board.BoardConstants.java
jwtc.chess.board.BoardHashKeys.java
jwtc.chess.board.BoardMembers.java
jwtc.chess.board.BoardStatics.java
jwtc.chess.board.ChessBoard.java