From 7a5b2e10c3b0dbd4b030fb69f995c9f6f6d1612f Mon Sep 17 00:00:00 2001 From: eehouse Date: Thu, 15 Apr 2010 02:16:30 +0000 Subject: [PATCH] changes, previously committed, to take advantage of new zoom API: hook up to volume key and to ZoomButtonsController, pass from UI thread to JNI thread and back, dis/enable buttons based on zoomability, and remove zoom submenu. --- .../android/XWords4/res/menu/board_menu.xml | 7 +-- .../android/XWords4/res/values/strings.xml | 2 - .../eehouse/android/xw4/BoardActivity.java | 30 ++++++++--- .../org/eehouse/android/xw4/BoardView.java | 54 +++++++++++++++---- .../org/eehouse/android/xw4/jni/DrawCtx.java | 1 - .../eehouse/android/xw4/jni/JNIThread.java | 14 ++--- .../eehouse/android/xw4/jni/SyncedDraw.java | 2 + .../org/eehouse/android/xw4/jni/XwJNI.java | 3 +- 8 files changed, 79 insertions(+), 34 deletions(-) diff --git a/xwords4/android/XWords4/res/menu/board_menu.xml b/xwords4/android/XWords4/res/menu/board_menu.xml index 016657157..950a4bb77 100644 --- a/xwords4/android/XWords4/res/menu/board_menu.xml +++ b/xwords4/android/XWords4/res/menu/board_menu.xml @@ -1,12 +1,6 @@ - - + Final scores - Zoom in - Zoom out Turn done Juggle Flip diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardActivity.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardActivity.java index 10b192017..48b6a9f97 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardActivity.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardActivity.java @@ -56,6 +56,8 @@ public class BoardActivity extends Activity implements UtilCtxt { private static final int QUERY_ENDGAME = Utils.DIALOG_LAST + 5; private static final int ASK_PASSWORD_BLK = Utils.DIALOG_LAST + 6; + private static final int ZOOM_AMT = 2; + private BoardView m_view; private int m_jniGamePtr; private CurGameInfo m_gi; @@ -309,13 +311,23 @@ public class BoardActivity extends Activity implements UtilCtxt { @Override public boolean onKeyDown( int keyCode, KeyEvent event ) { + boolean handled = false; if ( null != m_jniThread ) { XwJNI.XP_Key xpKey = keyCodeToXPKey( keyCode ); if ( XwJNI.XP_Key.XP_KEY_NONE != xpKey ) { m_jniThread.handle( JNIThread.JNICmd.CMD_KEYDOWN, xpKey ); + } else { + switch( keyCode ) { + case KeyEvent.KEYCODE_VOLUME_DOWN: + handled = doZoom( -ZOOM_AMT ); + break; + case KeyEvent.KEYCODE_VOLUME_UP: + handled = doZoom( ZOOM_AMT ); + break; + } } } - return super.onKeyDown( keyCode, event ); + return handled || super.onKeyDown( keyCode, event ); } @Override @@ -346,11 +358,6 @@ public class BoardActivity extends Activity implements UtilCtxt { case R.id.board_menu_done: cmd = JNIThread.JNICmd.CMD_COMMIT; break; - case R.id.board_menu_zoomout: - case R.id.board_menu_zoomin: - m_jniThread.handle( JNIThread.JNICmd.CMD_ZOOM, - id == R.id.board_menu_zoomout? -2 : 2 ); - break; case R.id.board_menu_juggle: cmd = JNIThread.JNICmd.CMD_JUGGLE; break; @@ -591,6 +598,8 @@ public class BoardActivity extends Activity implements UtilCtxt { m_xport.setReceiver( m_jniThread ); } m_jniThread.handle( JNICmd.CMD_START ); + // check and disable zoom button at limit + m_jniThread.handle( JNICmd.CMD_ZOOM, 0 ); } } } // loadGame @@ -648,6 +657,15 @@ public class BoardActivity extends Activity implements UtilCtxt { } ); } + private boolean doZoom( int zoomBy ) + { + boolean handled = null != m_jniThread; + if ( handled ) { + m_jniThread.handle( JNIThread.JNICmd.CMD_ZOOM, zoomBy ); + } + return handled; + } + // This is supposed to be called from the jni thread public int userPickTile( int playerNum, String[] texts ) { diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardView.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardView.java index f3395b64d..228ad96b6 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardView.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/BoardView.java @@ -33,6 +33,8 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.BitmapDrawable; import android.content.res.Resources; import android.graphics.Paint.FontMetricsInt; +import android.widget.ZoomButtonsController; +import android.os.Handler; import java.util.HashMap; import java.nio.IntBuffer; @@ -60,7 +62,7 @@ public class BoardView extends View implements DrawCtx, BoardHandler, private Drawable m_rightArrow; private Drawable m_downArrow; private Drawable m_origin; - private int m_top, m_left; + private int m_top; private JNIThread m_jniThread; private String[] m_scores; private String[] m_dictChars; @@ -69,6 +71,7 @@ public class BoardView extends View implements DrawCtx, BoardHandler, private int m_dictPtr = 0; private int m_lastSecsLeft; private HashMap m_bitmapsCache; + private Handler m_viewHandler; // FontDims: exists to translate space available to the largest // font we can draw within that space taking advantage of our use @@ -109,6 +112,7 @@ public class BoardView extends View implements DrawCtx, BoardHandler, private int[] m_bonusColors; private int[] m_playerColors; private int[] m_otherColors; + private ZoomButtonsController m_zoomButtons; public BoardView( Context context ) { @@ -131,14 +135,16 @@ public class BoardView extends View implements DrawCtx, BoardHandler, public boolean onTouchEvent( MotionEvent event ) { int action = event.getAction(); - int xx = (int)event.getX() - m_left; + int xx = (int)event.getX(); int yy = (int)event.getY() - m_top; switch ( action ) { case MotionEvent.ACTION_DOWN: + m_zoomButtons.setVisible( true ); m_jniThread.handle( JNIThread.JNICmd.CMD_PEN_DOWN, xx, yy ); break; case MotionEvent.ACTION_MOVE: + m_zoomButtons.setVisible( true ); m_jniThread.handle( JNIThread.JNICmd.CMD_PEN_MOVE, xx, yy ); break; case MotionEvent.ACTION_UP: @@ -158,11 +164,18 @@ public class BoardView extends View implements DrawCtx, BoardHandler, { synchronized( this ) { if ( layoutBoardOnce() ) { - canvas.drawBitmap( m_bitmap, m_left, m_top, m_drawPaint ); + canvas.drawBitmap( m_bitmap, 0, m_top, m_drawPaint ); } } } + @Override + protected void onDetachedFromWindow() + { + m_zoomButtons.setVisible( false ); + super.onDetachedFromWindow(); + } + private void init() { m_drawPaint = new Paint(); @@ -190,6 +203,22 @@ public class BoardView extends View implements DrawCtx, BoardHandler, m_playerColors = prefs.playerColors; m_bonusColors = prefs.bonusColors; m_otherColors = prefs.otherColors; + + m_viewHandler = new Handler(); + m_zoomButtons = new ZoomButtonsController( this ); + ZoomButtonsController.OnZoomListener lstnr = + new ZoomButtonsController.OnZoomListener(){ + public void onVisibilityChanged( boolean visible ){} + public void onZoom( boolean zoomIn ) + { + if ( null != m_jniThread ) { + int zoomBy = zoomIn ? 2 : -2; + m_jniThread.handle( JNIThread.JNICmd.CMD_ZOOM, zoomBy ); + } + } + }; + m_zoomButtons.setOnZoomListener( lstnr ); + m_zoomButtons.setZoomSpeed( 100 ); // milliseconds } private boolean layoutBoardOnce() @@ -208,7 +237,6 @@ public class BoardView extends View implements DrawCtx, BoardHandler, int nCells = m_gi.boardSize; int cellSize = width / nCells; - m_left = (width % nCells) / 2; // If we're vertical, we can likely fit all the board and // have a tall tray too. If horizontal, let's assume @@ -231,7 +259,7 @@ public class BoardView extends View implements DrawCtx, BoardHandler, m_top = 0; } - m_bitmap = Bitmap.createBitmap( 1 + (cellSize*nCells), + m_bitmap = Bitmap.createBitmap( 1 + width, 1 + trayHt + scoreHt + (cellSize *(nCells-nToScroll)), Bitmap.Config.ARGB_8888 ); @@ -288,6 +316,16 @@ public class BoardView extends View implements DrawCtx, BoardHandler, } } + public void zoomChanged( final boolean[] canZoom ) + { + m_viewHandler.post( new Runnable() { + public void run() { + m_zoomButtons.setZoomInEnabled( canZoom[0] ); + m_zoomButtons.setZoomOutEnabled( canZoom[1] ); + } + } ); + } + // DrawCtxt interface implementation public void scoreBegin( Rect rect, int numPlayers, int[] scores, int remCount, int dfs ) @@ -382,12 +420,6 @@ public class BoardView extends View implements DrawCtx, BoardHandler, } } - public boolean boardBegin( Rect rect, int cellWidth, int cellHeight, - int dfs ) - { - return true; - } - public boolean drawCell( Rect rect, String text, BitmapDrawable[] bitmaps, int tile, int owner, int bonus, int hintAtts, int flags ) diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/DrawCtx.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/DrawCtx.java index 961e156b2..db5843125 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/DrawCtx.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/DrawCtx.java @@ -49,7 +49,6 @@ public interface DrawCtx { void score_drawPlayer( Rect rInner, Rect rOuter, DrawScoreInfo dsi ); void drawTimer( Rect rect, int player, int secondsLeft ); - boolean boardBegin( Rect rect, int cellWidth, int cellHeight, int dfs ); boolean drawCell( Rect rect, String text, BitmapDrawable[] bitmaps, int tile, int owner, int bonus, int hintAtts, int flags ); void drawBoardArrow ( Rect rect, int bonus, boolean vert, int hintAtts, diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/JNIThread.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/JNIThread.java index b0ab00692..3901d736c 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/JNIThread.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/JNIThread.java @@ -163,7 +163,7 @@ public class JNIThread extends Thread { trayHt = height - (cellSize * (1 + (nCells-nToScroll))); } - int scoreWidth = nCells * cellSize; + int scoreWidth = width; if ( DeviceRole.SERVER_STANDALONE != m_gi.serverRole ) { scoreWidth -= cellSize; @@ -185,14 +185,12 @@ public class JNIThread extends Thread { scoreHt, true ); XwJNI.board_setPos( m_jniGamePtr, 0, scoreHt, - width, scoreHt + ((nCells-nToScroll) * cellSize), + width-1, ((nCells-nToScroll) * cellSize), false ); XwJNI.board_setTrayLoc( m_jniGamePtr, 0, scoreHt + ((nCells-nToScroll) * cellSize), - nCells * cellSize, // width - trayHt, // height - kMinDivWidth ); + width, trayHt, kMinDivWidth ); XwJNI.board_invalAll( m_jniGamePtr ); } @@ -260,7 +258,7 @@ public class JNIThread extends Thread { public void run() { - boolean[] barr = new boolean[1]; // scratch boolean + boolean[] barr = new boolean[2]; // scratch boolean while ( !m_stopped ) { QueueElem elem; Object[] args; @@ -382,7 +380,9 @@ public class JNIThread extends Thread { case CMD_ZOOM: draw = XwJNI.board_zoom( m_jniGamePtr, - ((Integer)args[0]).intValue() ); + ((Integer)args[0]).intValue(), + barr ); + m_drawer.zoomChanged( barr ); break; case CMD_VALUES: diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/SyncedDraw.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/SyncedDraw.java index 5d0da1a6d..de42166d6 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/SyncedDraw.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/SyncedDraw.java @@ -1,3 +1,4 @@ +/* -*- compile-command: "cd ../../../../../../; ant install"; -*- */ /* * Copyright 2009-2010 by Eric House (xwords@eehouse.org). All * rights reserved. @@ -25,4 +26,5 @@ public interface SyncedDraw { void doJNIDraw(); void doIconDraw( int resID, final Rect rect ); void prefsChanged(); + void zoomChanged( boolean[] canZoom ); } diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/XwJNI.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/XwJNI.java index 12703f56b..6653d0c3f 100644 --- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/XwJNI.java +++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/jni/XwJNI.java @@ -96,7 +96,8 @@ public class XwJNI { public static native void board_setPos( int gamePtr, int left, int top, int width, int height, boolean lefty ); - public static native boolean board_zoom( int gamePtr, int zoomBy ); + public static native boolean board_zoom( int gamePtr, int zoomBy, + boolean[] canZoom ); public static native void board_setScoreboardLoc( int gamePtr, int left, int top, int width, int height,