diff --git a/build.xml b/build.xml
index 84b57d68a..6f468d0fa 100644
--- a/build.xml
+++ b/build.xml
@@ -624,7 +624,8 @@
bundle-plugin-statusupdate,
bundle-updatecheckplugin,
bundle-dict,bundle-plugin-dictaccregwizz,
- bundle-plugin-simpleaccreg,bundle-plugin-generalconfig"/>
+ bundle-plugin-simpleaccreg,bundle-plugin-generalconfig,
+ bundle-plugin-googletalkaccregwizz"/>
@@ -1198,6 +1199,20 @@ javax.swing.event, javax.swing.border"/>
+
+
+
+
+
+
+
+
+
+
diff --git a/src/net/java/sip/communicator/plugin/googletalkaccregwizz/FirstWizardPage.java b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/FirstWizardPage.java
new file mode 100644
index 000000000..776b02e96
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/FirstWizardPage.java
@@ -0,0 +1,582 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.plugin.googletalkaccregwizz;
+
+import java.util.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import javax.swing.event.*;
+
+import net.java.sip.communicator.service.gui.*;
+import net.java.sip.communicator.service.protocol.*;
+import net.java.sip.communicator.util.*;
+
+/**
+ * The FirstWizardPage is the page, where user could enter the user
+ * ID and the password of the account.
+ *
+ * @author Lubomir Marinov
+ */
+public class FirstWizardPage
+ extends JPanel
+ implements WizardPage,
+ DocumentListener
+{
+ private static final Logger logger = Logger
+ .getLogger(FirstWizardPage.class);
+
+ public static final String FIRST_PAGE_IDENTIFIER = "FirstPageIdentifier";
+
+ public static final String USER_NAME_EXAMPLE = "Ex: johnsmith@gmail.com";
+
+ private JPanel userIDPassPanel = new JPanel(new BorderLayout(10, 10));
+
+ private JPanel labelsPanel = new JPanel();
+
+ private JPanel valuesPanel = new JPanel();
+
+ private JLabel userIDLabel = new JLabel(Resources.getString("username"));
+
+ private JLabel passLabel = new JLabel(Resources.getString("password"));
+
+ private JLabel existingAccountLabel = new JLabel(Resources
+ .getString("existingAccount"));
+
+ private JPanel emptyPanel = new JPanel();
+
+ private JLabel userIDExampleLabel = new JLabel(USER_NAME_EXAMPLE);
+
+ private JTextField userIDField = new JTextField();
+
+ private JPasswordField passField = new JPasswordField();
+
+ private JCheckBox rememberPassBox = new JCheckBox(Resources
+ .getString("rememberPassword"));
+
+ private JPanel advancedOpPanel = new JPanel(new BorderLayout(10, 10));
+
+ private JPanel labelsAdvOpPanel = new JPanel(new GridLayout(0, 1, 10, 10));
+
+ private JPanel valuesAdvOpPanel = new JPanel(new GridLayout(0, 1, 10, 10));
+
+ private JCheckBox sendKeepAliveBox = new JCheckBox(Resources
+ .getString("enableKeepAlive"));
+
+ private JCheckBox enableAdvOpButton = new JCheckBox(Resources
+ .getString("ovverideServerOps"), false);
+
+ private JLabel resourceLabel = new JLabel(Resources.getString("resource"));
+
+ private JTextField resourceField
+ = new JTextField(GoogleTalkAccountRegistration.DEFAULT_RESOURCE);
+
+ private JLabel priorityLabel = new JLabel(Resources.getString("priority"));
+
+ private JTextField priorityField
+ = new JTextField(GoogleTalkAccountRegistration.DEFAULT_PRIORITY);
+
+ private JLabel serverLabel = new JLabel(Resources.getString("server"));
+
+ private JTextField serverField = new JTextField();
+
+ private JLabel portLabel = new JLabel(Resources.getString("port"));
+
+ private JTextField portField
+ = new JTextField(GoogleTalkAccountRegistration.DEFAULT_PORT);
+
+ private JPanel registerPanel = new JPanel(new GridLayout(0, 1));
+
+ private JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
+
+ private JTextArea registerArea = new JTextArea(Resources
+ .getString("registerNewAccountText"));
+
+ private JButton registerButton = new JButton(Resources
+ .getString("registerNewAccount"));
+
+ private JPanel mainPanel = new JPanel();
+
+ private Object nextPageIdentifier = WizardPage.SUMMARY_PAGE_IDENTIFIER;
+
+ private GoogleTalkAccountRegistrationWizard wizard;
+
+ private boolean isCommitted = false;
+
+ /**
+ * Creates an instance of FirstWizardPage.
+ *
+ * @param wizard the parent wizard
+ */
+ public FirstWizardPage(GoogleTalkAccountRegistrationWizard wizard)
+ {
+
+ super(new BorderLayout());
+
+ this.wizard = wizard;
+
+ mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
+
+ this.init();
+
+ this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+
+ this.labelsPanel
+ .setLayout(new BoxLayout(labelsPanel, BoxLayout.Y_AXIS));
+
+ this.valuesPanel
+ .setLayout(new BoxLayout(valuesPanel, BoxLayout.Y_AXIS));
+ }
+
+ /**
+ * Initializes all panels, buttons, etc.
+ */
+ private void init()
+ {
+ this.userIDField.getDocument().addDocumentListener(this);
+ this.rememberPassBox.setSelected(true);
+
+ this.existingAccountLabel.setForeground(Color.RED);
+
+ this.userIDExampleLabel.setForeground(Color.GRAY);
+ this.userIDExampleLabel.setFont(userIDExampleLabel.getFont()
+ .deriveFont(8));
+ this.emptyPanel.setMaximumSize(new Dimension(40, 35));
+ this.userIDExampleLabel.setBorder(BorderFactory.createEmptyBorder(0, 0,
+ 8, 0));
+
+ labelsPanel.add(userIDLabel);
+ labelsPanel.add(emptyPanel);
+ labelsPanel.add(passLabel);
+
+ valuesPanel.add(userIDField);
+ valuesPanel.add(userIDExampleLabel);
+ valuesPanel.add(passField);
+
+ userIDPassPanel.add(labelsPanel, BorderLayout.WEST);
+ userIDPassPanel.add(valuesPanel, BorderLayout.CENTER);
+ userIDPassPanel.add(rememberPassBox, BorderLayout.SOUTH);
+
+ userIDPassPanel.setBorder(BorderFactory.createTitledBorder(Resources
+ .getString("userIDAndPassword")));
+
+ mainPanel.add(userIDPassPanel);
+
+ serverField.setEnabled(false);
+ portField.setEnabled(false);
+ resourceField.setEnabled(false);
+ priorityField.setEnabled(false);
+
+ enableAdvOpButton.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent evt)
+ {
+ // Perform action
+ JCheckBox cb = (JCheckBox) evt.getSource();
+
+ if (!wizard.isModification())
+ serverField.setEnabled(cb.isSelected());
+
+ portField.setEnabled(cb.isSelected());
+ resourceField.setEnabled(cb.isSelected());
+ priorityField.setEnabled(cb.isSelected());
+
+ if(!cb.isSelected())
+ {
+ setServerFieldAccordingToUserID();
+
+ portField.setText(
+ GoogleTalkAccountRegistration.DEFAULT_PORT);
+ resourceField.setText(
+ GoogleTalkAccountRegistration.DEFAULT_RESOURCE);
+ priorityField.setText(
+ GoogleTalkAccountRegistration.DEFAULT_PRIORITY);
+ }
+ }
+ });
+
+ portField.getDocument().addDocumentListener(new DocumentListener()
+ {
+ public void changedUpdate(DocumentEvent evt)
+ {
+ }
+
+ public void insertUpdate(DocumentEvent evt)
+ {
+ setNextButtonAccordingToPortAndPriority();
+ }
+
+ public void removeUpdate(DocumentEvent evt)
+ {
+ setNextButtonAccordingToPortAndPriority();
+ }
+ });
+
+ priorityField.getDocument().addDocumentListener(new DocumentListener()
+ {
+ public void changedUpdate(DocumentEvent evt)
+ {
+ }
+
+ public void insertUpdate(DocumentEvent evt)
+ {
+ setNextButtonAccordingToPortAndPriority();
+ }
+
+ public void removeUpdate(DocumentEvent evt)
+ {
+ setNextButtonAccordingToPortAndPriority();
+ }
+ });
+
+ labelsAdvOpPanel.add(serverLabel);
+ labelsAdvOpPanel.add(portLabel);
+ labelsAdvOpPanel.add(resourceLabel);
+ labelsAdvOpPanel.add(priorityLabel);
+
+ valuesAdvOpPanel.add(serverField);
+ valuesAdvOpPanel.add(portField);
+ valuesAdvOpPanel.add(resourceField);
+ valuesAdvOpPanel.add(priorityField);
+
+ JPanel checkBoxesPanel = new JPanel(new GridLayout(0, 1, 10, 10));
+ checkBoxesPanel.add(sendKeepAliveBox);
+ checkBoxesPanel.add(enableAdvOpButton);
+
+ advancedOpPanel.add(checkBoxesPanel, BorderLayout.NORTH);
+ advancedOpPanel.add(labelsAdvOpPanel, BorderLayout.WEST);
+ advancedOpPanel.add(valuesAdvOpPanel, BorderLayout.CENTER);
+
+ advancedOpPanel.setBorder(BorderFactory.createTitledBorder(Resources
+ .getString("advancedOptions")));
+
+ mainPanel.add(advancedOpPanel);
+
+ registerButton.addActionListener(new ActionListener()
+ {
+ public void actionPerformed(ActionEvent evt)
+ {
+ logger.debug("Reg OK");
+
+ /*
+ * We don't have our own implementation of registering/signing
+ * up with Google Talk so we'll just use webSignup.
+ */
+ wizard.webSignup();
+
+ logger.debug("Reg End");
+ }
+ });
+
+ buttonPanel.add(registerButton);
+
+ registerArea.setEnabled(false);
+ registerArea.setOpaque(false);
+ registerArea.setLineWrap(true);
+ registerArea.setWrapStyleWord(true);
+
+ registerPanel.add(registerArea);
+ registerPanel.add(buttonPanel);
+
+ registerPanel.setBorder(BorderFactory.createTitledBorder(Resources
+ .getString("registerNewAccount")));
+
+ mainPanel.add(registerPanel);
+
+ this.add(mainPanel, BorderLayout.NORTH);
+ }
+
+ /**
+ * Implements the WizardPage.getIdentifier to return this
+ * page identifier.
+ *
+ * @return the id of the first wizard page.
+ */
+ public Object getIdentifier()
+ {
+ return FIRST_PAGE_IDENTIFIER;
+ }
+
+ /**
+ * Implements the WizardPage.getNextPageIdentifier to return
+ * the next page identifier - the summary page.
+ *
+ * @return the id of the next wizard page.
+ */
+ public Object getNextPageIdentifier()
+ {
+ return nextPageIdentifier;
+ }
+
+ /**
+ * Implements the WizardPage.getBackPageIdentifier to return
+ * the next back identifier - the default page.
+ *
+ * @return the id of the default wizard page.
+ */
+ public Object getBackPageIdentifier()
+ {
+ return WizardPage.DEFAULT_PAGE_IDENTIFIER;
+ }
+
+ /**
+ * Implements the WizardPage.getWizardForm to return this
+ * panel.
+ *
+ * @return this wizard page.
+ */
+ public Object getWizardForm()
+ {
+ return this;
+ }
+
+ /**
+ * Before this page is displayed enables or disables the "Next" wizard
+ * button according to whether the User ID field is empty.
+ */
+ public void pageShowing()
+ {
+ this.setNextButtonAccordingToUserIDAndResource();
+ }
+
+ /**
+ * Saves the user input when the "Next" wizard buttons is clicked.
+ */
+ public void commitPage()
+ {
+ String userID = userIDField.getText();
+
+ if (!wizard.isModification() && isExistingAccount(userID))
+ {
+ nextPageIdentifier = FIRST_PAGE_IDENTIFIER;
+ userIDPassPanel.add(existingAccountLabel, BorderLayout.NORTH);
+ this.revalidate();
+ }
+ else
+ {
+ nextPageIdentifier = SUMMARY_PAGE_IDENTIFIER;
+ userIDPassPanel.remove(existingAccountLabel);
+
+ GoogleTalkAccountRegistration registration = wizard.getRegistration();
+
+ registration.setUserID(userIDField.getText());
+ registration.setPassword(new String(passField.getPassword()));
+ registration.setRememberPassword(rememberPassBox.isSelected());
+
+ registration.setServerAddress(serverField.getText());
+ registration.setSendKeepAlive(sendKeepAliveBox.isSelected());
+ registration.setResource(resourceField.getText());
+
+ if (portField.getText() != null)
+ registration.setPort(Integer.parseInt(portField.getText()));
+
+ if (priorityField.getText() != null)
+ registration.setPriority(
+ Integer.parseInt(priorityField.getText()));
+ }
+
+ isCommitted = true;
+ }
+
+ /**
+ * Enables or disables the "Next" wizard button according to whether the
+ * UserID field is empty.
+ */
+ private void setNextButtonAccordingToUserIDAndResource()
+ {
+ if (userIDField.getText() == null
+ || userIDField.getText().equals("")
+ || resourceField.getText() == null
+ || resourceField.getText().equals(""))
+ {
+ wizard.getWizardContainer().setNextFinishButtonEnabled(false);
+ }
+ else
+ {
+ wizard.getWizardContainer().setNextFinishButtonEnabled(true);
+ }
+ }
+
+ /**
+ * Handles the DocumentEvent triggered when user types in the
+ * UserID field. Enables or disables the "Next" wizard button according to
+ * whether the UserID field is empty.
+ *
+ * @param evt the document event that has triggered this method call.
+ */
+ public void insertUpdate(DocumentEvent evt)
+ {
+ this.setNextButtonAccordingToUserIDAndResource();
+
+ this.setServerFieldAccordingToUserID();
+ }
+
+ /**
+ * Handles the DocumentEvent triggered when user deletes letters
+ * from the User ID field. Enables or disables the "Next" wizard button
+ * according to whether the User ID field is empty.
+ *
+ * @param evt the document event that has triggered this method call.
+ */
+ public void removeUpdate(DocumentEvent evt)
+ {
+ this.setNextButtonAccordingToUserIDAndResource();
+
+ this.setServerFieldAccordingToUserID();
+ }
+
+ public void changedUpdate(DocumentEvent evt)
+ {
+ }
+
+ public void pageHiding()
+ {
+ }
+
+ public void pageShown()
+ {
+ }
+
+ public void pageBack()
+ {
+ }
+
+ /**
+ * Fills the User ID and Password fields in this panel with the data coming
+ * from the given protocolProvider.
+ *
+ * @param protocolProvider The ProtocolProviderService to load
+ * the data from.
+ */
+ public void loadAccount(ProtocolProviderService protocolProvider)
+ {
+ AccountID accountID = protocolProvider.getAccountID();
+
+ Map accountProperties = accountID.getAccountProperties();
+
+ String password = (String) accountProperties.get(
+ ProtocolProviderFactory.PASSWORD);
+
+ this.userIDField.setEnabled(false);
+ this.userIDField.setText(accountID.getUserID());
+
+ if (password != null)
+ {
+ this.passField.setText(password);
+ this.rememberPassBox.setSelected(true);
+ }
+
+ String serverAddress = (String) accountProperties
+ .get(ProtocolProviderFactory.SERVER_ADDRESS);
+
+ serverField.setText(serverAddress);
+
+ String serverPort = (String) accountProperties
+ .get(ProtocolProviderFactory.SERVER_PORT);
+
+ portField.setText(serverPort);
+
+ boolean keepAlive = new Boolean((String)accountProperties
+ .get("SEND_KEEP_ALIVE")).booleanValue();
+
+ sendKeepAliveBox.setSelected(keepAlive);
+
+ String resource = (String) accountProperties.get(
+ ProtocolProviderFactory.RESOURCE);
+
+ resourceField.setText(resource);
+
+ String priority = (String) accountProperties.get(
+ ProtocolProviderFactory.RESOURCE_PRIORITY);
+
+ priorityField.setText(priority);
+
+ if (!serverPort.equals(GoogleTalkAccountRegistration.DEFAULT_PORT)
+ || !resource.equals(GoogleTalkAccountRegistration.DEFAULT_RESOURCE)
+ || !priority.equals(GoogleTalkAccountRegistration.DEFAULT_PRIORITY))
+ {
+ enableAdvOpButton.setSelected(true);
+
+ // The server field should stay disabled in modification mode,
+ // because the user should not be able to change anything concerning
+ // the account identifier and server name is part of it.
+ serverField.setEnabled(false);
+
+ portField.setEnabled(true);
+ resourceField.setEnabled(true);
+ priorityField.setEnabled(true);
+ }
+ }
+
+ /**
+ * Parse the server part from the Google Talk id and set it to server as
+ * default value. If Advanced option is enabled Do nothing.
+ */
+ private void setServerFieldAccordingToUserID()
+ {
+ if (!enableAdvOpButton.isSelected())
+ {
+ String userId = userIDField.getText();
+
+ serverField.setText(wizard.getServerFromUserName(userId));
+ }
+ }
+
+ /**
+ * Disables Next Button if Port field value is incorrect
+ */
+ private void setNextButtonAccordingToPortAndPriority()
+ {
+ try
+ {
+ new Integer(portField.getText());
+ new Integer(priorityField.getText());
+ wizard.getWizardContainer().setNextFinishButtonEnabled(true);
+ }
+ catch (NumberFormatException ex)
+ {
+ wizard.getWizardContainer().setNextFinishButtonEnabled(false);
+ }
+ }
+
+ /**
+ * Checks if the accountName corresponds to an already existing account.
+ *
+ * @param accountName the name of the account to check
+ * @return TRUE if an account with the specified name already exists, FALSE -
+ * otherwise.
+ */
+ private boolean isExistingAccount(String accountName)
+ {
+ ProtocolProviderFactory factory = GoogleTalkAccRegWizzActivator
+ .getGoogleTalkProtocolProviderFactory();
+
+ ArrayList registeredAccounts = factory.getRegisteredAccounts();
+
+ for (int i = 0; i < registeredAccounts.size(); i++)
+ {
+ AccountID accountID = (AccountID) registeredAccounts.get(i);
+
+ if (accountName.equalsIgnoreCase(accountID.getUserID()))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Object getSimpleForm()
+ {
+ return userIDPassPanel;
+ }
+
+ public boolean isCommitted()
+ {
+ return isCommitted;
+ }
+}
diff --git a/src/net/java/sip/communicator/plugin/googletalkaccregwizz/GoogleTalkAccRegWizzActivator.java b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/GoogleTalkAccRegWizzActivator.java
new file mode 100644
index 000000000..135a2f00c
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/GoogleTalkAccRegWizzActivator.java
@@ -0,0 +1,126 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.plugin.googletalkaccregwizz;
+
+import java.util.*;
+
+import org.osgi.framework.*;
+
+import net.java.sip.communicator.service.browserlauncher.*;
+import net.java.sip.communicator.service.gui.*;
+import net.java.sip.communicator.service.protocol.*;
+import net.java.sip.communicator.util.*;
+
+/**
+ * Registers the GoogleTalkAccountRegistrationWizard in the UI Service.
+ *
+ * @author Lubomir Marinov
+ */
+public class GoogleTalkAccRegWizzActivator
+ implements BundleActivator
+{
+ public static BundleContext bundleContext;
+
+ private static final Logger logger = Logger.getLogger(
+ GoogleTalkAccRegWizzActivator.class.getName());
+
+ private static BrowserLauncherService browserLauncherService;
+
+ private static UIService uiService;
+
+ /**
+ * Starts this bundle.
+ * @param bc BundleContext
+ * @throws Exception
+ */
+ public void start(BundleContext bc)
+ throws Exception
+ {
+ bundleContext = bc;
+
+ uiService =
+ (UIService) bundleContext.getService(bundleContext
+ .getServiceReference(UIService.class.getName()));
+
+ GoogleTalkAccountRegistrationWizard wizard =
+ new GoogleTalkAccountRegistrationWizard(uiService
+ .getAccountRegWizardContainer());
+
+ Hashtable containerFilter
+ = new Hashtable();
+ containerFilter.put(
+ ProtocolProviderFactory.PROTOCOL,
+ GoogleTalkAccountRegistrationWizard.PROTOCOL);
+
+ bundleContext.registerService(
+ AccountRegistrationWizard.class.getName(),
+ wizard,
+ containerFilter);
+ }
+
+ public void stop(BundleContext bundleContext)
+ throws Exception
+ {
+ }
+
+ /**
+ * Returns the ProtocolProviderFactory for the Google Talk
+ * protocol.
+ *
+ * @return the ProtocolProviderFactory for the Google Talk
+ * protocol
+ */
+ public static ProtocolProviderFactory getGoogleTalkProtocolProviderFactory()
+ {
+ ServiceReference[] serRefs = null;
+
+ String osgiFilter = "("
+ + ProtocolProviderFactory.PROTOCOL
+ + "=" + ProtocolNames.JABBER + ")";
+
+ try
+ {
+ serRefs = bundleContext.getServiceReferences(
+ ProtocolProviderFactory.class.getName(), osgiFilter);
+ }
+ catch (InvalidSyntaxException ex)
+ {
+ logger.error("GoogleTalkAccRegWizzActivator : " + ex);
+ }
+
+ return (ProtocolProviderFactory) bundleContext.getService(serRefs[0]);
+ }
+
+ /**
+ * Returns the UIService.
+ *
+ * @return the UIService
+ */
+ public static UIService getUIService()
+ {
+ return uiService;
+ }
+
+ /**
+ * Returns the BrowserLauncherService obtained from the bundle
+ * context.
+ * @return the BrowserLauncherService obtained from the bundle
+ * context
+ */
+ public static BrowserLauncherService getBrowserLauncher() {
+ if (browserLauncherService == null)
+ {
+ browserLauncherService =
+ (BrowserLauncherService) bundleContext
+ .getService(bundleContext
+ .getServiceReference(BrowserLauncherService.class
+ .getName()));
+ }
+
+ return browserLauncherService;
+ }
+}
diff --git a/src/net/java/sip/communicator/plugin/googletalkaccregwizz/GoogleTalkAccountRegistration.java b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/GoogleTalkAccountRegistration.java
new file mode 100644
index 000000000..175bfc353
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/GoogleTalkAccountRegistration.java
@@ -0,0 +1,167 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.plugin.googletalkaccregwizz;
+
+/**
+ * The GoogleTalkAccountRegistration is used to store all user input
+ * data through the GoogleTalkAccountRegistrationWizard.
+ *
+ * @author Lubomir Marinov
+ */
+public class GoogleTalkAccountRegistration
+{
+ public static final String DEFAULT_PORT = "5222";
+
+ public static final String DEFAULT_PRIORITY = "10";
+
+ public static final String DEFAULT_RESOURCE = "sip-comm";
+
+ private String userID;
+
+ private String password;
+
+ private boolean rememberPassword = true;
+
+ private String serverAddress;
+
+ private int port = new Integer(DEFAULT_PORT).intValue();
+
+ private String resource = DEFAULT_RESOURCE;
+
+ private int priority = new Integer(DEFAULT_PRIORITY).intValue();
+
+ private boolean sendKeepAlive = true;
+
+ /**
+ * Returns the password of the Google Talk registration account.
+ * @return the password of the Google Talk registration account.
+ */
+ public String getPassword()
+ {
+ return password;
+ }
+
+ /**
+ * Sets the password of the Google Talk registration account.
+ * @param password the password of the Google Talk registration account.
+ */
+ public void setPassword(String password)
+ {
+ this.password = password;
+ }
+
+ /**
+ * Returns TRUE if password has to remembered, FALSE otherwise.
+ * @return TRUE if password has to remembered, FALSE otherwise
+ */
+ public boolean isRememberPassword()
+ {
+ return rememberPassword;
+ }
+
+ /**
+ * Sets the rememberPassword value of this Google Talk account registration.
+ * @param rememberPassword TRUE if password has to remembered, FALSE
+ * otherwise
+ */
+ public void setRememberPassword(boolean rememberPassword)
+ {
+ this.rememberPassword = rememberPassword;
+ }
+
+ /**
+ * Returns the User ID of the Google Talk registration account.
+ * @return the User ID of the Google Talk registration account.
+ */
+ public String getUserID()
+ {
+ return userID;
+ }
+
+ /**
+ * The address of the server we will use for this account
+ * @return String
+ */
+ public String getServerAddress()
+ {
+ return serverAddress;
+ }
+
+ /**
+ * The port on the specified server
+ * @return int
+ */
+ public int getPort()
+ {
+ return port;
+ }
+
+ /**
+ * Is sending of keep alive packets is enabled
+ * @return boolean
+ */
+ public boolean isSendKeepAlive()
+ {
+ return sendKeepAlive;
+ }
+
+ /**
+ * Sets the User ID of the Google Talk registration account.
+ * @param userID the identifier of the Google Talk registration account.
+ */
+ public void setUserID(String userID)
+ {
+ this.userID = userID;
+ }
+
+ /**
+ * Setting the server
+ * @param serverAddress String
+ */
+ public void setServerAddress(String serverAddress)
+ {
+ this.serverAddress = serverAddress;
+ }
+
+ /**
+ * Setting the port
+ * @param port int
+ */
+ public void setPort(int port)
+ {
+ this.port = port;
+ }
+
+ /**
+ * Set whether to send keep alive packets
+ * @param sendKeepAlive boolean
+ */
+ public void setSendKeepAlive(boolean sendKeepAlive)
+ {
+ this.sendKeepAlive = sendKeepAlive;
+ }
+
+ public String getResource()
+ {
+ return resource;
+ }
+
+ public void setResource(String resource)
+ {
+ this.resource = resource;
+ }
+
+ public int getPriority()
+ {
+ return priority;
+ }
+
+ public void setPriority(int priority)
+ {
+ this.priority = priority;
+ }
+}
diff --git a/src/net/java/sip/communicator/plugin/googletalkaccregwizz/GoogleTalkAccountRegistrationWizard.java b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/GoogleTalkAccountRegistrationWizard.java
new file mode 100644
index 000000000..ff106a38e
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/GoogleTalkAccountRegistrationWizard.java
@@ -0,0 +1,415 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.plugin.googletalkaccregwizz;
+
+import java.awt.*;
+import java.util.*;
+
+import net.java.sip.communicator.service.gui.*;
+import net.java.sip.communicator.service.protocol.*;
+
+import org.osgi.framework.*;
+
+/**
+ * The GoogleTalkAccountRegistrationWizard is an implementation of the
+ * AccountRegistrationWizard for the Google Talk protocol. It should
+ * allow the user to create and configure a new Google Talk account.
+ *
+ * @author Lubomir Marinov
+ */
+public class GoogleTalkAccountRegistrationWizard
+ implements AccountRegistrationWizard
+{
+ private static final String GOOGLE_USER_SUFFIX = "gmail.com";
+
+ private static final String GOOGLE_CONNECT_SRV = "talk.google.com";
+
+ public static final String PROTOCOL = "Google Talk";
+
+ private FirstWizardPage firstWizardPage;
+
+ private GoogleTalkAccountRegistration registration
+ = new GoogleTalkAccountRegistration();
+
+ private WizardContainer wizardContainer;
+
+ private ProtocolProviderService protocolProvider;
+
+ private boolean isModification;
+
+ /**
+ * Creates an instance of GoogleTalkAccountRegistrationWizard.
+ * @param wizardContainer the wizard container, where this wizard
+ * is added
+ */
+ public GoogleTalkAccountRegistrationWizard(WizardContainer wizardContainer)
+ {
+ this.wizardContainer = wizardContainer;
+
+ this.wizardContainer.setFinishButtonText(Resources.getString("signin"));
+ }
+
+ /**
+ * Implements the AccountRegistrationWizard.getIcon method.
+ * Returns the icon to be used for this wizard.
+ * @return byte[]
+ */
+ public byte[] getIcon()
+ {
+ return Resources.getImage(Resources.PROTOCOL_ICON);
+ }
+
+ /**
+ * Implements the AccountRegistrationWizard.getPageImage method.
+ * Returns the image used to decorate the wizard page
+ *
+ * @return byte[] the image used to decorate the wizard page
+ */
+ public byte[] getPageImage()
+ {
+ return Resources.getImage(Resources.PAGE_IMAGE);
+ }
+
+ /**
+ * Implements the AccountRegistrationWizard.getProtocolName
+ * method. Returns the protocol name for this wizard.
+ * @return String
+ */
+ public String getProtocolName()
+ {
+ return Resources.getString("protocolName");
+ }
+
+ /**
+ * Implements the AccountRegistrationWizard.getProtocolDescription
+ * method. Returns the description of the protocol for this wizard.
+ * @return String
+ */
+ public String getProtocolDescription()
+ {
+ return Resources.getString("protocolDescription");
+ }
+
+ /**
+ * Returns the set of pages contained in this wizard.
+ * @return Iterator
+ */
+ public Iterator getPages()
+ {
+ ArrayList pages = new ArrayList();
+ firstWizardPage = new FirstWizardPage(this);
+
+ pages.add(firstWizardPage);
+
+ return pages.iterator();
+ }
+
+ /**
+ * Returns the set of data that user has entered through this wizard.
+ * @return Iterator
+ */
+ public Iterator getSummary()
+ {
+ Hashtable summaryTable = new Hashtable();
+
+ summaryTable.put( Resources.getString("username"),
+ registration.getUserID());
+
+ summaryTable.put( Resources.getString("rememberPassword"),
+ new Boolean(registration.isRememberPassword()));
+
+ summaryTable.put( Resources.getString("server"),
+ registration.getServerAddress());
+
+ summaryTable.put( Resources.getString("port"),
+ String.valueOf(registration.getPort()));
+
+ summaryTable.put( Resources.getString("enableKeepAlive"),
+ String.valueOf(registration.isSendKeepAlive()));
+
+ summaryTable.put( Resources.getString("resource"),
+ registration.getResource());
+
+ summaryTable.put( Resources.getString("priority"),
+ String.valueOf(registration.getPriority()));
+
+ return summaryTable.entrySet().iterator();
+ }
+
+ /**
+ * Installs the account created through this wizard.
+ *
+ * @return ProtocolProviderService
+ */
+ public ProtocolProviderService signin()
+ {
+ if (!firstWizardPage.isCommitted())
+ firstWizardPage.commitPage();
+
+ return signin( registration.getUserID(),
+ registration.getPassword());
+ }
+
+ public ProtocolProviderService signin(String userName, String password)
+ {
+ firstWizardPage = null;
+ ProtocolProviderFactory factory
+ = GoogleTalkAccRegWizzActivator.getGoogleTalkProtocolProviderFactory();
+
+ return this.installAccount(factory,
+ userName,
+ password);
+ }
+
+ /**
+ * Creates an account for the given user and password.
+ *
+ * @param providerFactory the ProtocolProviderFactory which will create
+ * the account
+ * @param user the user identifier
+ * @param passwd the password
+ * @return the ProtocolProviderService for the new account.
+ */
+ public ProtocolProviderService installAccount(
+ ProtocolProviderFactory providerFactory,
+ String userName,
+ String passwd)
+ {
+ Hashtable accountProperties = new Hashtable();
+
+ /* Make the account use the resources specific to Google Talk. */
+ accountProperties.put(ProtocolProviderFactory.PROTOCOL, PROTOCOL);
+ accountProperties
+ .put(ProtocolProviderFactory.PROTOCOL_ICON_PATH,
+ GoogleTalkAccountRegistrationWizard.class.getClassLoader()
+ .getResource("resources/images/protocol/googletalk")
+ .toString());
+
+ if (registration.isRememberPassword())
+ {
+ accountProperties.put(ProtocolProviderFactory.PASSWORD, passwd);
+ }
+
+ accountProperties.put("SEND_KEEP_ALIVE",
+ String.valueOf(registration.isSendKeepAlive()));
+
+ String serverName = null;
+ if (registration.getServerAddress() != null)
+ {
+ serverName = registration.getServerAddress();
+ }
+ else
+ {
+ serverName = getServerFromUserName(userName);
+ }
+ accountProperties.put(ProtocolProviderFactory.SERVER_ADDRESS,
+ serverName);
+
+ accountProperties.put(ProtocolProviderFactory.SERVER_PORT,
+ String.valueOf(registration.getPort()));
+
+ accountProperties.put(ProtocolProviderFactory.RESOURCE,
+ registration.getResource());
+
+ accountProperties.put(ProtocolProviderFactory.RESOURCE_PRIORITY,
+ String.valueOf(registration.getPriority()));
+
+ if (isModification)
+ {
+ providerFactory.modifyAccount( protocolProvider,
+ accountProperties);
+
+ this.isModification = false;
+
+ return protocolProvider;
+ }
+
+ try
+ {
+ AccountID accountID = providerFactory.installAccount(
+ userName, accountProperties);
+
+ ServiceReference serRef = providerFactory
+ .getProviderForAccount(accountID);
+
+ protocolProvider = (ProtocolProviderService)
+ GoogleTalkAccRegWizzActivator.bundleContext
+ .getService(serRef);
+ }
+ catch (IllegalArgumentException exc)
+ {
+ GoogleTalkAccRegWizzActivator.getUIService().getPopupDialog()
+ .showMessagePopupDialog(exc.getMessage(),
+ Resources.getString("error"),
+ PopupDialog.ERROR_MESSAGE);
+ }
+ catch (IllegalStateException exc)
+ {
+ GoogleTalkAccRegWizzActivator.getUIService().getPopupDialog()
+ .showMessagePopupDialog(exc.getMessage(),
+ Resources.getString("error"),
+ PopupDialog.ERROR_MESSAGE);
+ }
+
+ return protocolProvider;
+ }
+
+ /**
+ * Fills the User ID and Password fields in this panel with the data coming
+ * from the given protocolProvider.
+ * @param protocolProvider The ProtocolProviderService to load the
+ * data from.
+ */
+ public void loadAccount(ProtocolProviderService protocolProvider)
+ {
+ this.isModification = true;
+
+ this.protocolProvider = protocolProvider;
+
+ this.registration = new GoogleTalkAccountRegistration();
+
+ this.firstWizardPage.loadAccount(protocolProvider);
+ }
+
+ /**
+ * Indicates if this wizard is opened for modification or for creating a
+ * new account.
+ *
+ * @return true if this wizard is opened for modification and
+ * false otherwise.
+ */
+ public boolean isModification()
+ {
+ return isModification;
+ }
+
+ /**
+ * Returns the wizard container, where all pages are added.
+ *
+ * @return the wizard container, where all pages are added
+ */
+ public WizardContainer getWizardContainer()
+ {
+ return wizardContainer;
+ }
+
+ /**
+ * Returns the registration object, which will store all the data through
+ * the wizard.
+ *
+ * @return the registration object, which will store all the data through
+ * the wizard
+ */
+ public GoogleTalkAccountRegistration getRegistration()
+ {
+ return registration;
+ }
+
+ /**
+ * Returns the size of this wizard.
+ * @return the size of this wizard
+ */
+ public Dimension getSize()
+ {
+ return new Dimension(300, 480);
+ }
+
+ /**
+ * Returns the identifier of the page to show first in the wizard.
+ * @return the identifier of the page to show first in the wizard.
+ */
+ public Object getFirstPageIdentifier()
+ {
+ return firstWizardPage.getIdentifier();
+ }
+
+ /**
+ * Returns the identifier of the page to show last in the wizard.
+ * @return the identifier of the page to show last in the wizard.
+ */
+ public Object getLastPageIdentifier()
+ {
+ return firstWizardPage.getIdentifier();
+ }
+
+ /**
+ * Sets the modification property to indicate if this wizard is opened for
+ * a modification.
+ *
+ * @param isModification indicates if this wizard is opened for modification
+ * or for creating a new account.
+ */
+ public void setModification(boolean isModification)
+ {
+ this.isModification = isModification;
+ }
+
+ /**
+ * Returns an example string, which should indicate to the user how the
+ * user name should look like.
+ * @return an example string, which should indicate to the user how the
+ * user name should look like.
+ */
+ public String getUserNameExample()
+ {
+ return FirstWizardPage.USER_NAME_EXAMPLE;
+ }
+
+ /**
+ * Enables the simple "Sign in" form.
+ */
+ public boolean isSimpleFormEnabled()
+ {
+ return true;
+ }
+
+ /**
+ * Parse the server part from the Google Talk id and set it to server as
+ * default value. If Advanced option is enabled Do nothing.
+ */
+ protected String getServerFromUserName(String userName)
+ {
+ int delimIndex = userName.indexOf("@");
+ if (delimIndex != -1)
+ {
+ String newServerAddr = userName.substring(delimIndex + 1);
+ if (newServerAddr.equals(GOOGLE_USER_SUFFIX))
+ {
+ return GOOGLE_CONNECT_SRV;
+ }
+ else
+ {
+ return newServerAddr;
+ }
+ }
+
+ return null;
+ }
+
+ public void webSignup()
+ {
+ GoogleTalkAccRegWizzActivator.getBrowserLauncher()
+ .openURL("https://www.google.com/accounts/NewAccount");
+ }
+
+ /**
+ * Returns true if the web sign up is supported by the current
+ * implementation, false - otherwise.
+ * @return true if the web sign up is supported by the current
+ * implementation, false - otherwise
+ */
+ public boolean isWebSignupSupported()
+ {
+ return true;
+ }
+
+ public Object getSimpleForm()
+ {
+ firstWizardPage = new FirstWizardPage(this);
+ return firstWizardPage.getSimpleForm();
+ }
+}
diff --git a/src/net/java/sip/communicator/plugin/googletalkaccregwizz/Resources.java b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/Resources.java
new file mode 100644
index 000000000..889d62f5a
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/Resources.java
@@ -0,0 +1,181 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license. See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.plugin.googletalkaccregwizz;
+
+import java.io.*;
+import java.util.*;
+
+import net.java.sip.communicator.util.*;
+
+/**
+ * The Resources class manages the access to the internationalization
+ * properties files and the image resources used in this plugin.
+ *
+ * @author Lubomir Marinov
+ */
+public class Resources
+{
+ private static Logger log = Logger.getLogger(Resources.class);
+
+ /**
+ * The name of the resource, where internationalization strings for this
+ * plugin are stored.
+ */
+ private static final String STRING_RESOURCE_NAME =
+ "resources.languages.plugin.googletalkaccregwizz.resources";
+
+ /**
+ * The name of the resource, where paths to images used in this bundle are
+ * stored.
+ */
+ private static final String RESOURCE_NAME =
+ "net.java.sip.communicator.plugin.googletalkaccregwizz.resources";
+
+ /**
+ * The string resource bundle.
+ */
+ private static final ResourceBundle STRING_RESOURCE_BUNDLE =
+ ResourceBundle.getBundle(STRING_RESOURCE_NAME);
+
+ /**
+ * The image resource bundle.
+ */
+ private static final ResourceBundle RESOURCE_BUNDLE =
+ ResourceBundle.getBundle(RESOURCE_NAME);
+
+ /**
+ * A constant pointing to the Google Talk protocol logo image.
+ */
+ public static ImageID PROTOCOL_ICON = new ImageID("protocolIcon");
+
+ /**
+ * A constant pointing to the Aim protocol wizard page image.
+ */
+ public static ImageID PAGE_IMAGE = new ImageID("pageImage");
+
+ /**
+ * Returns an internationalized string corresponding to the given key.
+ *
+ * @param key The key of the string.
+ * @return An internationalized string corresponding to the given key.
+ */
+ public static String getString(String key)
+ {
+ String resourceString;
+ try
+ {
+ resourceString = STRING_RESOURCE_BUNDLE.getString(key);
+
+ int mnemonicIndex = resourceString.indexOf('&');
+
+ if (mnemonicIndex > -1)
+ {
+ String firstPart = resourceString.substring(0, mnemonicIndex);
+ String secondPart = resourceString.substring(mnemonicIndex + 1);
+
+ resourceString = firstPart.concat(secondPart);
+ }
+ }
+ catch (MissingResourceException e)
+ {
+ resourceString = '!' + key + '!';
+ }
+
+ return resourceString;
+ }
+
+ /**
+ * Returns an internationalized string corresponding to the given key.
+ *
+ * @param key The key of the string.
+ * @return An internationalized string corresponding to the given key.
+ */
+ public static char getMnemonic(String key)
+ {
+ String resourceString;
+
+ try
+ {
+ resourceString = STRING_RESOURCE_BUNDLE.getString(key);
+
+ int mnemonicIndex = resourceString.indexOf('&');
+
+ if (mnemonicIndex > -1)
+ {
+ return resourceString.charAt(mnemonicIndex + 1);
+ }
+
+ }
+ catch (MissingResourceException e)
+ {
+ return '!';
+ }
+
+ return '!';
+ }
+
+ /**
+ * Loads an image from a given image identifier.
+ *
+ * @param imageID The identifier of the image.
+ * @return The image for the given identifier.
+ */
+ public static byte[] getImage(ImageID imageID)
+ {
+ byte[] image = new byte[100000];
+
+ String path = RESOURCE_BUNDLE.getString(imageID.getId());
+
+ try
+ {
+ Resources.class.getClassLoader().getResourceAsStream(path).read(
+ image);
+ }
+ catch (IOException e)
+ {
+ log.error("Failed to load image:" + path, e);
+ }
+
+ return image;
+ }
+
+ /**
+ * Returns the resource for the given key. This could be any resource stored
+ * in the resources.properties file of this bundle.
+ *
+ * @param key the key of the resource to search for
+ * @return the resource for the given key
+ */
+ public static String getProperty(String key)
+ {
+ try
+ {
+ return RESOURCE_BUNDLE.getString(key);
+ }
+ catch (MissingResourceException e)
+ {
+ return '!' + key + '!';
+ }
+ }
+
+ /**
+ * Represents the Image Identifier.
+ */
+ public static class ImageID
+ {
+ private String id;
+
+ private ImageID(String id)
+ {
+ this.id = id;
+ }
+
+ public String getId()
+ {
+ return id;
+ }
+ }
+}
diff --git a/src/net/java/sip/communicator/plugin/googletalkaccregwizz/googletalkaccregwizz.manifest.mf b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/googletalkaccregwizz.manifest.mf
new file mode 100644
index 000000000..6266fcef0
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/googletalkaccregwizz.manifest.mf
@@ -0,0 +1,38 @@
+Bundle-Activator: net.java.sip.communicator.plugin.googletalkaccregwizz.GoogleTalkAccRegWizzActivator
+Bundle-Name: Google Talk account registration wizard
+Bundle-Description: Google Talk account registration wizard.
+Bundle-Vendor: sip-communicator.org
+Bundle-Version: 0.0.1
+Import-Package: org.osgi.framework,
+ net.java.sip.communicator.util,
+ net.java.sip.communicator.service.configuration,
+ net.java.sip.communicator.service.configuration.event,
+ net.java.sip.communicator.service.protocol,
+ net.java.sip.communicator.service.protocol.icqconstants,
+ net.java.sip.communicator.service.protocol.event,
+ net.java.sip.communicator.service.contactlist,
+ net.java.sip.communicator.service.contactlist.event,
+ net.java.sip.communicator.service.gui,
+ net.java.sip.communicator.service.gui.event,
+ net.java.sip.communicator.service.fileaccess,
+ net.java.sip.communicator.service.browserlauncher,
+ javax.naming,
+ javax.naming.directory,
+ javax.xml.parsers,
+ org.w3c.dom,
+ org.xml.sax,
+ javax.swing,
+ javax.swing.event,
+ javax.swing.table,
+ javax.swing.text,
+ javax.swing.text.html,
+ javax.accessibility,
+ javax.swing.plaf,
+ javax.swing.plaf.metal,
+ javax.swing.plaf.basic,
+ javax.imageio,
+ javax.swing.filechooser,
+ javax.swing.tree,
+ javax.swing.undo,
+ javax.swing.border,
+ org.jivesoftware.smack
diff --git a/src/net/java/sip/communicator/plugin/googletalkaccregwizz/resources.properties b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/resources.properties
new file mode 100644
index 000000000..647f3b764
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/googletalkaccregwizz/resources.properties
@@ -0,0 +1,2 @@
+protocolIcon=resources/images/protocol/googletalk/status16x16-online.png
+pageImage=resources/images/protocol/googletalk/logo48x48.png