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