X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/FreeShisen/blobdiff_plain/109ae6fe4de6c323c6956a8a6f401b70f05ccaa6..b5d364506be25f41b232f91f19c6aaf79a76c4dc:/src/de/cwde/freeshisen/ShisenShoView.java?ds=sidebyside diff --git a/src/de/cwde/freeshisen/ShisenShoView.java b/src/de/cwde/freeshisen/ShisenShoView.java index 7d92a0a..d8af296 100644 --- a/src/de/cwde/freeshisen/ShisenShoView.java +++ b/src/de/cwde/freeshisen/ShisenShoView.java @@ -1,5 +1,6 @@ package de.cwde.freeshisen; +import java.lang.ref.WeakReference; import java.util.List; import java.util.Locale; import java.util.Timer; @@ -28,6 +29,7 @@ import android.view.SurfaceView; class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { + private static final String INVALID_TIME = "9:99:99"; private static final String COLOR_TEXT = "#FFFFFF"; private static final String COLOR_TEXT_SHADOW = "#000000"; private static final String COLOR_HINT = "#F0C000"; @@ -44,22 +46,39 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { private int tileWidth; private Bitmap bg; private Bitmap tile[]; - private Point selection1 = new Point(0,0); - private Point selection2 = new Point(0,0); - private List path=null; - private List pairs=null; + private Point selection1 = new Point(0, 0); + private Point selection2 = new Point(0, 0); + private List path = null; + private List pairs = null; private long startTime; private long playTime; private long baseTime; private Timer timer; - private static Handler timerHandler; - private boolean timerRegistered=false; + static class hHandler extends Handler { + private final WeakReference mTarget; + + hHandler(ShisenShoView target) { + mTarget = new WeakReference(target); + } + + @Override + public void handleMessage(Message msg) { + ShisenShoView target = mTarget.get(); + if (target != null) + target.onUpdateTime(); + } + } + + private Handler timerHandler = new hHandler(this); + + private boolean timerRegistered = false; private ShisenSho app; private StatePlay cstate; private StatePaint pstate; private Canvas canvas = null; private SurfaceHolder surfaceHolder = null; + private String time = INVALID_TIME; public ShisenShoView(ShisenSho shishenSho) { super((Context) shishenSho); @@ -130,27 +149,23 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { } private void registerTimer() { - if (timer!=null) return; // Already registered - timerHandler = new Handler() { - public void handleMessage(Message msg) { - onUpdateTime(); - } - }; - timer=new Timer(); + if (timer != null) + return; // Already registered + timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { public void run() { timerHandler.sendEmptyMessage(Activity.RESULT_OK); } }, 0, 1000); - timerRegistered=true; + timerRegistered = true; } private void unregisterTimer() { - if (timer==null) return; // Already unregistered + if (timer == null) + return; // Already unregistered timer.cancel(); timer = null; - timerHandler = null; - timerRegistered=false; + timerRegistered = false; } public void pauseTime() { @@ -183,7 +198,7 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { startTime=System.currentTimeMillis(); playTime=0; baseTime=0; - if (app.timeCounter && !timerRegistered) { + if (!timerRegistered) { registerTimer(); } pairs=app.board.getPairs(1); @@ -227,7 +242,7 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { private void onUndoActivate() { if (app.board.getCanUndo()) { - if (cstate==StatePlay.GAMEOVER && app.timeCounter && !timerRegistered) { + if (cstate==StatePlay.GAMEOVER && !timerRegistered) { // Reprogram the time update that had been // deactivated with the game over status registerTimer(); @@ -240,7 +255,7 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { } public void onTimeCounterActivate() { - if (app.timeCounter && cstate!=StatePlay.GAMEOVER && !timerRegistered) { + if (cstate!=StatePlay.GAMEOVER && !timerRegistered) { // Reprogram the time update that had been // deactivated with the time_counter=false registerTimer(); @@ -249,7 +264,7 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { private void onUpdateTime() { paint(pstate); - if (!(app.timeCounter && cstate!=StatePlay.GAMEOVER)) { + if (cstate==StatePlay.GAMEOVER) { unregisterTimer(); } } @@ -289,14 +304,8 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { protected void doDraw(Canvas canvas) { try { - // Double buffering - // Bitmap buffer = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888); - //Canvas cbuffer = new Canvas(buffer); - Canvas cbuffer = canvas; if (canvas == null) return; - //super.onDraw(canvas); - // Board upper left corner on screen int x0=0; int y0=0; @@ -308,8 +317,6 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { int selectcolor = Color.parseColor(COLOR_SELECTED); int hintcolor = Color.parseColor(COLOR_HINT); - Paint paint = new Paint(); - paint.setFlags(Paint.ANTI_ALIAS_FLAG); // Background & board painting switch (pstate) { @@ -326,7 +333,7 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { int bgHeight = bg.getHeight(); for (int i=0; i 0) { @@ -392,26 +393,21 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { Point a = pair.a; Point b = pair.b; path = app.board.getPath(a, b); - paint.setColor(hintcolor); - paint.setStyle(Style.STROKE); - paint.setStrokeCap(Cap.ROUND); - paint.setStrokeJoin(Join.ROUND); - paint.setStrokeWidth(3); - highlightTile(cbuffer, x0, y0, a, hintcolor); + highlightTile(canvas, x0, y0, a, hintcolor); if (path != null) { Point p0 = null; for (Point p1 : path) { if (p0 != null) { - drawLine(cbuffer, x0, y0, p0, p1, paint); + drawLine(canvas, x0, y0, p0, p1, hintcolor); } p0 = p1; } path = null; } - highlightTile(cbuffer, x0, y0, b, hintcolor); + highlightTile(canvas, x0, y0, b, hintcolor); } break; } @@ -419,16 +415,16 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { // Win & loose notifications switch (pstate) { case WIN: - drawMessage(cbuffer, screenWidth / 2, screenHeight / 2, true, + drawMessage(canvas, screenWidth / 2, screenHeight / 2, true, "You Win!", 100); break; case LOSE: - drawMessage(cbuffer, screenWidth / 2, screenHeight / 2, true, + drawMessage(canvas, screenWidth / 2, screenHeight / 2, true, "Game Over", 100); break; } - if (app.timeCounter) switch (pstate) { + switch (pstate) { case BOARD: case SELECTED1: case SELECTED2: @@ -441,31 +437,21 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { int hours = (int) (playTime / (60 * 60)); int minutes = (int) ((playTime / 60) % 60); int seconds = (int) (playTime % 60); - String time = String.format(Locale.US, "%01d:%02d:%02d", - hours, minutes, seconds); + if (hours < 10) { + time = String.format(Locale.US, "%01d:%02d:%02d", + hours, minutes, seconds); + } else { + time = INVALID_TIME; + } int timePosX=screenWidth-120; int timePosY=screenHeight-10; - - drawMessage(cbuffer, timePosX, timePosY, false, time, 30); - break; - } - - // Debug messages - /* - debugMessage="StatePlay: "+cstate+"\n"+"StatePaint: "+pstate; - if (debugMessage!=null && debugMessage.length()>0) { - int l = 20; - String lines[] = debugMessage.split("\n"); - for (int i=0; i