From 8076682d1b8b83f1c3da9024fd094cbc26c0273d Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Sun, 6 Dec 2020 09:49:57 +0100 Subject: [PATCH] AbstractGuiGame: only create Timer when needed, and destroy again after game end --- .../java/forge/screens/match/CMatchUI.java | 1 + .../forge/screens/match/MatchController.java | 1 + .../java/forge/match/AbstractGuiGame.java | 23 +++++++++++++++++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index cb49ced38f4..a505d104ac5 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -1025,6 +1025,7 @@ public final class CMatchUI @Override public void afterGameEnd() { + super.afterGameEnd(); Singletons.getView().getLpnDocument().remove(targetingOverlay.getPanel()); FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 7471e651775..51c1ffafe75 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -445,6 +445,7 @@ public class MatchController extends AbstractGuiGame { @Override public void afterGameEnd() { + super.afterGameEnd(); Forge.back(); //view = null; } diff --git a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java index fbff635cf47..dd6490bebb3 100644 --- a/forge-gui/src/main/java/forge/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/match/AbstractGuiGame.java @@ -188,7 +188,12 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { return true; } if(spectator!=null) { //workaround fix!! this is needed on above code or it will - gameControllers.remove(spectator); //bug the UI! remove spectator here since its must not be here... + for (Map.Entry e : gameControllers.entrySet()) { + if (e.getValue().equals(spectator)) { + gameControllers.remove(e.getKey()); + break; + } + } return true; } try{ @@ -368,11 +373,14 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { return autoPassUntilEndOfTurn.contains(player); } - private final Timer awaitNextInputTimer = new Timer(); + private Timer awaitNextInputTimer; private TimerTask awaitNextInputTask; @Override public final void awaitNextInput() { + if (awaitNextInputTimer == null) { + awaitNextInputTimer = new Timer("awaitNextInputTimer Game:" + this.gameView.getId() + " Player:" + this.currentPlayer.getLobbyPlayerName()); + } //delay updating prompt to await next input briefly so buttons don't flicker disabled then enabled awaitNextInputTask = new TimerTask() { @Override @@ -400,6 +408,9 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { @Override public final void cancelAwaitNextInput() { + if (awaitNextInputTimer == null) { + return; + } synchronized (awaitNextInputTimer) { //ensure task doesn't reset awaitNextInputTask during this block if (awaitNextInputTask != null) { try { @@ -725,5 +736,13 @@ public abstract class AbstractGuiGame implements IGuiGame, IMayViewCards { public void handleLandPlayed(Card land, Zone zone) { } + + @Override + public void afterGameEnd() { + if (awaitNextInputTimer != null) { + awaitNextInputTimer.cancel(); + awaitNextInputTimer = null; + } + } // End of Choice code }