X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/FreeShisen/blobdiff_plain/c12aff68a818d5cd53d4b42954e79bba0a2e255f..07fd4c9f7cc4b5ba98994f9c153213adf7c01a44:/src/de/cwde/freeshisen/ShisenShoView.java diff --git a/src/de/cwde/freeshisen/ShisenShoView.java b/src/de/cwde/freeshisen/ShisenShoView.java index 76d7fc6..9207d3d 100644 --- a/src/de/cwde/freeshisen/ShisenShoView.java +++ b/src/de/cwde/freeshisen/ShisenShoView.java @@ -1,12 +1,15 @@ package de.cwde.freeshisen; +import java.lang.ref.WeakReference; import java.util.List; import java.util.Locale; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; +import android.app.AlertDialog; import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; @@ -21,6 +24,7 @@ import android.graphics.Rect; import android.graphics.Typeface; import android.os.Handler; import android.os.Message; +import android.preference.PreferenceManager; import android.view.MenuItem; import android.view.MotionEvent; import android.view.SurfaceHolder; @@ -45,17 +49,33 @@ 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; @@ -72,8 +92,11 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { } public ShisenShoView(Context ctx) { - super((Context) ctx); - // silence lint? + super(ctx); + this.app = (ShisenSho) ctx; + cstate = StatePlay.UNINITIALIZED; + surfaceHolder = getHolder(); + surfaceHolder.addCallback(this); } private void paint(StatePaint pstate) { @@ -85,10 +108,10 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { this.cstate=cstate; } - private void loadTileset() { + public void loadTileset() { BitmapFactory.Options ops = new BitmapFactory.Options(); ops.inScaled = false; - Bitmap tileset = BitmapFactory.decodeResource(getResources(), R.drawable.tileset, ops); + Bitmap tileset = BitmapFactory.decodeResource(getResources(), app.tilesetid, ops); tileset.setDensity(Bitmap.DENSITY_NONE); // The tile set has 4 rows x 9 columns @@ -101,8 +124,8 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { // align to screen: // "large" is 16x6, and we want to have a nice border, so we use 17x7 and // choose the lowest scale so everything fits - float scalex = ((float) screenWidth/17) / loadedtileWidth; - float scaley = ((float) screenHeight/7) / loadedtileHeight; + float scalex = ((float) (screenWidth - 2)/17) / loadedtileWidth; + float scaley = ((float) (screenHeight - 2)/7) / loadedtileHeight; if (scaley < scalex) { scalex = scaley; } else { @@ -132,27 +155,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() { @@ -185,7 +204,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); @@ -229,7 +248,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(); @@ -242,7 +261,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(); @@ -251,7 +270,7 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { private void onUpdateTime() { paint(pstate); - if (!(app.timeCounter && cstate!=StatePlay.GAMEOVER)) { + if (cstate==StatePlay.GAMEOVER) { unregisterTimer(); } } @@ -527,6 +546,7 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { if (pairs.size() == 0) { if (app.board.getNumPieces() == 0) { paint(StatePaint.WIN); + checkforhiscore(); } else { paint(StatePaint.LOSE); } @@ -548,10 +568,44 @@ class ShisenShoView extends SurfaceView implements SurfaceHolder.Callback { } } + private void checkforhiscore() { + if (timerRegistered) { + unregisterTimer(); + } + final String[] sizes = { "S", "M", "L" }; + final String[] diffs = { "E", "H" }; + String prefname1 = "hiscore_" + diffs[app.difficulty-1] + sizes[app.size-1] + "1"; + String prefname2 = "hiscore_" + diffs[app.difficulty-1] + sizes[app.size-1] + "2"; + // get hiscores for current size/difficulty + SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(app); + String besttime1 = sp.getString(prefname1, INVALID_TIME); + String besttime2 = sp.getString(prefname2, INVALID_TIME); + // did we win something? + if (time.compareTo(besttime2) < 0) { + // score! + new AlertDialog.Builder(app.activity) + .setTitle("Hiscore!") + .setCancelable(true) + .setIcon(R.drawable.icon) + .setPositiveButton(app.getString(android.R.string.ok), null) + .setMessage("You've made the highscore list!").create() // FIXME: hardcoded string + .show(); + + SharedPreferences.Editor editor = sp.edit(); + if (time.compareTo(besttime1) < 0) { + editor.putString(prefname1, time); + editor.putString(prefname2, besttime1); + } else { + editor.putString(prefname2, time); + } + editor.commit(); + } + } + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { surfaceHolder = holder; - if (cstate!=StatePlay.GAMEOVER && app.timeCounter && !timerRegistered) { + if (cstate!=StatePlay.GAMEOVER && !timerRegistered) { registerTimer(); } repaint();