void fetchPassword() {
    Config config = Config.instance();
    config.updateConfig(
        this.emailField.getText(),
        this.passField.getText(),
        "",
        this.rememberPasswordCheckbox.getState());

    if (config.getEmail().isEmpty() || config.getPassword().isEmpty()) {
      JOptionPane.showMessageDialog(
          mainPanel, "Empty email or SSO password", "Bad SSO Account", JOptionPane.ERROR_MESSAGE);
      return;
    }

    taskThread = new TwoTaskThread(TwoTaskThread.GEN_PASSWORD | TwoTaskThread.GEN_QRCODE);

    setBusy();
    taskThread.start();
    timer.start();
  }
  public MainWindow() {
    Config config = Config.instance();

    {
      URL url = MainWindow.class.getResource("/idle.png");
      if (url != null) {
        idleIcon = new ImageIcon(url);
      }

      url = MainWindow.class.getResource("/wait_cursor.gif");
      if (url != null) {
        waitIcon = new ImageIcon(url);
      }
    }

    loadGUI();

    timer =
        new Timer(
            100,
            new ActionListener() {
              public void actionPerformed(ActionEvent arg0) {
                if (!taskThread.isAlive()) {
                  // task finished without errors
                  if (!taskThread.error.isEmpty()) {
                    if (taskThread.isGenPassword() && Config.instance().wifiPassword.isEmpty()) {
                      passField.setText("");
                      JOptionPane.showMessageDialog(
                          mainPanel,
                          "Invalid SSO info, please try again:" + taskThread.error,
                          "Login Failed",
                          JOptionPane.ERROR_MESSAGE);
                    } else if (taskThread.isGenQRCode()) {
                      JOptionPane.showMessageDialog(
                          mainPanel,
                          "Failed to generate QR Image, please try again: " + taskThread.error,
                          "QRCode Generation Failed",
                          JOptionPane.ERROR_MESSAGE);
                    }
                  }
                  timer.stop();
                  taskThread = null;

                  displayWifiPassword();

                  buttonGetPassword.setText(idleButtonText);
                  buttonGetPassword.setEnabled(true);
                }
              }
            });

    if (!config.getWifiPassword().isEmpty()) {
      taskThread = new TwoTaskThread(TwoTaskThread.GEN_QRCODE);

      qrCodeLabel.setIcon(waitIcon);

      setBusy();
      taskThread.start();
      timer.start();
    } else if (!(config.getEmail().isEmpty() || config.getPassword().isEmpty())) {
      fetchPassword();
    } else {
      qrCodeLabel.setIcon(idleIcon);
    }
  }