protected void destroyApp(boolean unconditional, boolean isProgress) {
    ProgressCanvas progressCanvas = ProgressCanvasFactory.getInstance();

    if (isProgress) {
      progressCanvas.start();

      this.commandAction(MyCommandsFactory.getInstance().SET_DISPLAYABLE, progressCanvas);

      // progressCanvas.waitUntilDisplayed();
    }

    this.destroyApp(unconditional);

    if (isProgress) {
      progressCanvas.end();
    }
  }
  public synchronized void commandAction(Command command, Displayable displayable) {
    try {
      String displayableAsString = NO_DISPLAYABLE;
      if (displayable != null) {
        displayableAsString = displayable.toString();
      }

      String label = NO_COMMAND;
      if (command != null) {
        label = command.getLabel();
      }

      PreLogUtil.put(
          new StringMaker()
              .append(COMMAND_NAME)
              .append(label)
              .append(DISPLAYABLE)
              .append(displayableAsString)
              .toString(),
          this,
          this.COMMAND_ACTION);

      GameCommandsFactory gameCommandsFactory = GameCommandsFactory.getInstance();

      if (command == gameCommandsFactory.SHOW_GAME_CANVAS) {
        // TWB - If progress concurrency is a problem then this is probably the cause
        if (this.getDisplay().getCurrent() != this.allbinaryGameCanvasRunnableInterface) {
          this.setDisplay((Displayable) this.allbinaryGameCanvasRunnableInterface);
        }

        this.unPauseAppBackground(false);
      } else if (command == gameCommandsFactory.CLOSE_AND_SHOW_GAME_CANVAS) {
        // this.closeMenuListener();
        MenuListener menuListener = (MenuListener) displayable;
        menuListener.close();

        this.setDisplay((Displayable) this.allbinaryGameCanvasRunnableInterface);
        this.unPauseAppBackground(false);
      } else if (command == gameCommandsFactory.EXIT_COMMAND) {
        // TWB - Handle exit for android differently
        if (GameMidletEventHandler.getInstance().getEventListenerInterfaceList().size() == 0) {
          this.exit(true);
        }

        GameMidletEventHandler.getInstance().fireEvent(null);
      } else if (command == gameCommandsFactory.EXIT_WITHOUT_PROGRESS_COMMAND) {
        this.exit(false);
      } else if (command == gameCommandsFactory.START_COMMAND
          || command == gameCommandsFactory.RESTART_COMMAND
          || command == gameCommandsFactory.CONTINUE_COMMAND) {
        // GameState gameState = GameStateFactory.getInstance(command);
        if (gameMidletStateFactory.getCurrentGameState() != GameState.PLAYING_GAME_STATE
            || command == gameCommandsFactory.RESTART_COMMAND) {
          if (this.gameStartTimeHelper.isTime()) {
            this.createGame();
            gameMidletStateFactory.setCurrentGameState(GameState.PLAYING_GAME_STATE);
          } else {
            LogUtil.put(
                LogFactory.getInstance(
                    "Starting Game Too Often", this, MidletStrings.getInstance().COMMAND_ACTION));
          }

        } else {
          LogUtil.put(LogFactory.getInstance("Already in playing state", this, COMMAND_ACTION));
        }

      } else if (command == gameCommandsFactory.BUY_COMMAND) {
        InApplicationPurchaseFactory inApplicationPurchaseFactory =
            InApplicationPurchaseFactory.getInstance();

        final BasicArrayList list = LockableFeatureFactory.getInstance().getList();
        LockableFeature lockableFeature = (LockableFeature) list.get(0);

        if (list.size() > 0 && !inApplicationPurchaseFactory.isPurchased(lockableFeature)) {
          inApplicationPurchaseFactory.purchase(lockableFeature);
          // TextNotificationUtil.getInstance().fireSuccess("In Application Purchase Request");
        } else {
          TextNotificationUtil.getInstance().fireSuccess("Already Purchased");
        }
      } else if (command == gameCommandsFactory.QUIT_COMMAND) {
        if (this.gameStartTimeHelper.isTime()) {
          this.stopGameCanvasRunnableInterface();
          gameMidletStateFactory.setCurrentGameState(GameState.NO_GAME_STATE);
          this.setDemo();
        }
      } else if (command == MyCommandsFactory.getInstance().RESUME_COMMAND) {
        this.unPauseAppBackground(false);
      } else if (command == MyCommandsFactory.getInstance().PAUSE_COMMAND) {
        this.pauseAppBackground(false);
      } else if (command == MyCommandsFactory.getInstance().SET_DISPLAYABLE) {
        this.pauseAppBackground(false);

        this.setDisplay(displayable);
      } else if (command == gameCommandsFactory.SET_MENU_DISPLAYABLE) {
        this.pauseAppBackground(false);

        MenuListener menuListener = (MenuListener) displayable;
        menuListener.open();

        this.setDisplay(displayable);
      } else if (command == gameCommandsFactory.START_TRACE) {
        this.debugInterface.start();
        ((AllBinaryGameCanvas) this.allbinaryGameCanvasRunnableInterface)
            .addCommand(gameCommandsFactory.STOP_TRACE);
        ((AllBinaryGameCanvas) this.allbinaryGameCanvasRunnableInterface)
            .removeCommand(gameCommandsFactory.START_TRACE);
      } else if (command == gameCommandsFactory.STOP_TRACE) {
        this.pauseAppBackground(false);
        this.debugInterface.stop();
        this.unPauseAppBackground(false);
        ((AllBinaryGameCanvas) this.allbinaryGameCanvasRunnableInterface)
            .addCommand(gameCommandsFactory.START_TRACE);
        ((AllBinaryGameCanvas) this.allbinaryGameCanvasRunnableInterface)
            .removeCommand(gameCommandsFactory.STOP_TRACE);
      } else if (command == gameCommandsFactory.DEFAULT_OPTIONS) {
        Displayable tempDisplayable = displayable;
        if (tempDisplayable instanceof GameOptionsForm) {
          GameFeatureFormUtil.getInstance().setDefault((CommandForm) tempDisplayable);
        }
      } else if (command == GameInputMappingInstructionsCanvas.DISPLAY) {
        Displayable tempDisplayable = displayable;
        if (tempDisplayable instanceof GameInputMappingCanvas) {
          GameInputMappingCanvas gameInputMappingCanvas = (GameInputMappingCanvas) tempDisplayable;
          gameInputMappingCanvas.update();
        }

        this.commandAction(
            gameCommandsFactory.SET_MENU_DISPLAYABLE, this.getInputMappingInstructionsCanvas());

        // this.setDisplay((Displayable) this.getInputMappingInstructionsCanvas());
      } else if (HighScoreCommandsFactory.getInstance().isHighScoreCommand(command)) {
        Displayable tempDisplayable = displayable;
        if (tempDisplayable instanceof HighScoresCanvas) {
          HighScoresCanvas highScoresCanvas = (HighScoresCanvas) tempDisplayable;

          highScoresCanvas.updateCommand(command);
        }
      } else if (command == HighScoreCommands.getInstance().DISPLAY) {
        this.commandAction(gameCommandsFactory.SET_MENU_DISPLAYABLE, this.createHighScoresCanvas());
      } else if (command == GameInputMappingInstructionsCanvas.CLOSE) {
        MenuListener menuListener = (MenuListener) displayable;
        menuListener.close();

        this.commandAction(GameInputMappingCanvas.DISPLAY, null);
      } else if (command == GameInputMappingCanvas.DISPLAY) {
        // TWB - Called for HTML5 but not others?
        Features features = Features.getInstance();

        if (features.isDefault(HTMLFeatureFactory.getInstance().HTML)) {
          this.pauseAppBackground(false);
        }

        this.commandAction(gameCommandsFactory.SET_MENU_DISPLAYABLE, this.getInputMappingCanvas());

        // this.setDisplay((Displayable) this.getInputMappingCanvas());
      } else if (command == GameInputMappingCanvas.DEFAULT) {
        Displayable tempDisplayable = displayable;
        if (tempDisplayable instanceof GameInputMappingCanvas) {
          GameInputMappingCanvas gameInputMappingCanvas = (GameInputMappingCanvas) tempDisplayable;
          gameInputMappingCanvas.setDefault();
        }
      } else if (command == InGameOptionsForm.DISPLAY) {
        this.pauseAppBackground(false);

        ProgressCanvas progressCanvas = ProgressCanvasFactory.getInstance();

        progressCanvas.addPortion(50, "In Game Options");

        AllBinaryGameLayerManager layerManager = this.createGameLayerManager();

        InGameOptionsFormFactory.init(
            this,
            new InGameFeatures(),
            "Options In Game",
            layerManager.getBackgroundBasicColor(),
            layerManager.getForegroundBasicColor());

        InGameOptionsForm inGameOptionsForm = InGameOptionsFormFactory.getInstance();

        inGameOptionsForm.setItemStateListener(this.allbinaryGameCanvasRunnableInterface);

        this.commandAction(gameCommandsFactory.SET_MENU_DISPLAYABLE, inGameOptionsForm);
      } else if (command == InGameOptionsForm.DEFAULT) {
        GameFeatureFormUtil.getInstance().setDefault(InGameOptionsFormFactory.getInstance());
      } else if (command == gameCommandsFactory.DISPLAY_OPTIONS) {
        AllBinaryMediaManager.setMuted(true);
        this.stopAll();

        MainFeatureFactory mainFeatureFactory = MainFeatureFactory.getInstance();
        Features features = Features.getInstance();

        isFullScreen = features.isFeature(mainFeatureFactory.FULL_SCREEN);

        // PreLogUtil.put("Open isFullScreen: " + isFullScreen, this,
        // MidletStrings.getInstance().COMMAND_ACTION);

        ResizableListenerHandler.getInstance().fireEvent(true);

        this.setResized(false);

        this.commandAction(gameCommandsFactory.SET_MENU_DISPLAYABLE, this.getGameOptionsForm());
      } else if (command == gameCommandsFactory.CLOSE_OPTIONS) {
        // PreLogUtil.put("Close", this, MidletStrings.getInstance().COMMAND_ACTION);
        ResizableListenerHandler.getInstance().fireEvent(false);

        this.commandAction(gameCommandsFactory.CLOSE_AND_SHOW_GAME_CANVAS, displayable);

        StringMaker stringBuffer = new StringMaker();
        stringBuffer.append("Close isFullScreen/change: ");
        stringBuffer.append(isFullScreen);
        stringBuffer.append(FullScreenUtil.isScreenChange(isFullScreen));
        stringBuffer.append(" isResized: ");
        stringBuffer.append(this.isResized());

        PreLogUtil.put(stringBuffer.toString(), this, COMMAND_ACTION);

        // Restart canvas if screen change
        if (this.isResized() || FullScreenUtil.isScreenChange(isFullScreen)) {
          // PreLogUtil.put("Resized/Changed", this, MidletStrings.getInstance().COMMAND_ACTION);

          this.updateFullScreen();
        }

        AllBinaryMediaManager.setMuted(false);
      } else if (command == gameCommandsFactory.DISPLAY_LOAD_FORM) {
        this.pauseAppBackground(false);

        KeyValuePersistance keyValuePersistance = GamePersistanceSingleton.getInstance();

        keyValuePersistance.clear();
        keyValuePersistance.loadAll();

        if (this.getLoadGameForm() == null) {
          AllBinaryGameLayerManager layerManager = this.createGameLayerManager();

          this.setLoadGameForm(
              new LoadGameForm(
                  this,
                  "Load Game",
                  layerManager.getBackgroundBasicColor(),
                  layerManager.getForegroundBasicColor()));
        } else {
          this.getLoadGameForm().update();
        }

        this.commandAction(gameCommandsFactory.SET_MENU_DISPLAYABLE, this.getLoadGameForm());

        // this.setDisplay((Displayable) this.getLoadGameForm());
      } else if (command == gameCommandsFactory.LOAD_FILE) {
        int index = this.getLoadGameForm().getSelectedId();

        if (index != -1) {
          KeyValuePersistance keyValuePersistance = GamePersistanceSingleton.getInstance();

          this.setStartStateHashtable(keyValuePersistance.get(index));

          MenuListener menuListener = this.getLoadGameForm();
          menuListener.close();

          PreLogUtil.put(BasicMotionGesturesHandler.getInstance().toString(), this, COMMAND_ACTION);

          this.commandAction(gameCommandsFactory.START_COMMAND, null);

          PreLogUtil.put(BasicMotionGesturesHandler.getInstance().toString(), this, COMMAND_ACTION);
        }
      } else if (command == gameCommandsFactory.DELETE_FILE) {
        int index = this.getLoadGameForm().getSelectedText();

        if (index != -1) {
          KeyValuePersistance keyValuePersistance = GamePersistanceSingleton.getInstance();

          keyValuePersistance.delete(index);
          keyValuePersistance.clear();
          keyValuePersistance.loadAll(1);
          this.getLoadGameForm().update();
        }
      }
      /*
      else if (command == GameCommands.DISPLAY_SAVE_FORM)
      {
      this.pauseApp();
      this.setDisplay((Displayable) this.getSaveGameForm());
      }*/
      else if (command == gameCommandsFactory.SAVE) {
        KeyValuePersistance keyValuePersistance = GamePersistanceSingleton.getInstance();

        this.pauseAppBackground(false);
        // String name = ((SaveGameForm) this.getSaveGameForm()).getText();
        keyValuePersistance.save(this.getCurrentStateHashtable());

        // this.setDisplay((Displayable) allbinaryGameCanvasRunnableInterface);

        this.unPauseAppBackground(false);
      } else if (command == HighScoreTextBox.SUBMIT_TEXTBOX_COMMAND) {
        LogUtil.put(LogFactory.getInstance("Submitted Score", this, COMMAND_ACTION));

        this.allbinaryGameCanvasRunnableInterface.setHighScoreSubmitted(true);

        this.commandAction(gameCommandsFactory.CLOSE_AND_SHOW_GAME_CANVAS, displayable);
      } else if (command == gameCommandsFactory.DISPLAY_ABOUT) {
        this.commandAction(gameCommandsFactory.SET_MENU_DISPLAYABLE, this.getAboutCanvas());
      } else if (command == gameCommandsFactory.TOGGLE_KEYBOARD) {
        VirtualKeyboardEventHandler virtualKeyboardEventHandler =
            VirtualKeyboardEventHandler.getInstance();

        virtualKeyboardEventHandler.fireEvent(virtualKeyboardEventHandler.SHOW_EVENT);
      } else if (command.getLabel().compareTo(gameCommandsFactory.TOGGLE_FULLSCREEN.getLabel())
          == 0) {
        MainFeatureFactory mainFeatureFactory = MainFeatureFactory.getInstance();

        Features features = Features.getInstance();

        boolean isFullScreen = features.isFeature(mainFeatureFactory.FULL_SCREEN);

        if (isFullScreen) {
          features.removeDefault(mainFeatureFactory.FULL_SCREEN);
        } else {
          features.addDefault(mainFeatureFactory.FULL_SCREEN);
        }

        this.updateFullScreen();
      }

      // no else
      // if (command != gameCommandsFactory.START_COMMAND && command !=
      // gameCommandsFactory.RESTART_COMMAND)
      // {
      // gameMidletStateFactory.setCurrentGameState(GameState.NO_GAME_STATE);
      // }

    } catch (Exception e) {
      LogUtil.put(
          LogFactory.getInstance(
              CommonStrings.getInstance().EXCEPTION,
              this,
              MidletStrings.getInstance().COMMAND_ACTION,
              e));
      if (command != GameCommandsFactory.getInstance().EXIT_COMMAND) {
        this.exit(false);
      }
    }
  }