| Index: dart/editor/tools/plugins/com.google.dart.tools.debug.ui/src/com/google/dart/tools/debug/ui/internal/dialogs/MobilePortForwardDialog.java
|
| ===================================================================
|
| --- dart/editor/tools/plugins/com.google.dart.tools.debug.ui/src/com/google/dart/tools/debug/ui/internal/dialogs/MobilePortForwardDialog.java (revision 0)
|
| +++ dart/editor/tools/plugins/com.google.dart.tools.debug.ui/src/com/google/dart/tools/debug/ui/internal/dialogs/MobilePortForwardDialog.java (revision 0)
|
| @@ -0,0 +1,205 @@
|
| +package com.google.dart.tools.debug.ui.internal.dialogs;
|
| +
|
| +import com.google.dart.tools.core.DartCore;
|
| +import com.google.dart.tools.core.mobile.AndroidDebugBridge;
|
| +import com.google.dart.tools.core.mobile.AndroidDevice;
|
| +import com.google.dart.tools.debug.ui.internal.mobile.MobileMainTab;
|
| +import com.google.dart.tools.ui.internal.util.ExternalBrowserUtil;
|
| +
|
| +import org.eclipse.core.runtime.IStatus;
|
| +import org.eclipse.core.runtime.Status;
|
| +import org.eclipse.jface.dialogs.Dialog;
|
| +import org.eclipse.jface.dialogs.IDialogConstants;
|
| +import org.eclipse.swt.SWT;
|
| +import org.eclipse.swt.events.SelectionAdapter;
|
| +import org.eclipse.swt.events.SelectionEvent;
|
| +import org.eclipse.swt.events.SelectionListener;
|
| +import org.eclipse.swt.graphics.Point;
|
| +import org.eclipse.swt.layout.GridData;
|
| +import org.eclipse.swt.layout.GridLayout;
|
| +import org.eclipse.swt.widgets.Button;
|
| +import org.eclipse.swt.widgets.Composite;
|
| +import org.eclipse.swt.widgets.Control;
|
| +import org.eclipse.swt.widgets.Label;
|
| +import org.eclipse.swt.widgets.Link;
|
| +import org.eclipse.swt.widgets.Shell;
|
| +
|
| +import java.net.ConnectException;
|
| +
|
| +public class MobilePortForwardDialog extends Dialog {
|
| +
|
| + private final String pageUrl;
|
| + private Link descriptionLabel;
|
| + private Label testResultLabel;
|
| +
|
| + public MobilePortForwardDialog(Shell parentShell, String pageUrl, boolean localhostOverUsb) {
|
| + super(parentShell);
|
| + this.pageUrl = pageUrl;
|
| + setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE);
|
| + }
|
| +
|
| + @Override
|
| + protected void configureShell(Shell newShell) {
|
| + super.configureShell(newShell);
|
| + newShell.setText("Mobile Launch");
|
| + }
|
| +
|
| + @Override
|
| + protected Control createButtonBar(Composite parent) {
|
| + Composite buttonBar = (Composite) super.createButtonBar(parent);
|
| + ((GridLayout) buttonBar.getLayout()).makeColumnsEqualWidth = false;
|
| + buttonBar.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL
|
| + | GridData.VERTICAL_ALIGN_CENTER));
|
| + return buttonBar;
|
| + }
|
| +
|
| + @Override
|
| + protected void createButtonsForButtonBar(Composite parent) {
|
| +
|
| + final Button testButton = createButton(
|
| + parent,
|
| + IDialogConstants.CLIENT_ID,
|
| + "Test Connection",
|
| + false);
|
| + testButton.addSelectionListener(new SelectionAdapter() {
|
| + @Override
|
| + public void widgetDefaultSelected(SelectionEvent e) {
|
| + widgetSelected(e);
|
| + }
|
| +
|
| + @Override
|
| + public void widgetSelected(SelectionEvent e) {
|
| + testConnection();
|
| + }
|
| + });
|
| + testButton.getDisplay().asyncExec(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + testButton.setFocus();
|
| + }
|
| + });
|
| +
|
| + // increment the number of columns in the button bar
|
| + ((GridLayout) parent.getLayout()).numColumns++;
|
| + testResultLabel = new Label(parent, SWT.NONE);
|
| + testResultLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
|
| +
|
| + Button closeButton = createButton(
|
| + parent,
|
| + IDialogConstants.CLOSE_ID,
|
| + IDialogConstants.CLOSE_LABEL,
|
| + true);
|
| + closeButton.addSelectionListener(new SelectionAdapter() {
|
| + @Override
|
| + public void widgetDefaultSelected(SelectionEvent e) {
|
| + widgetSelected(e);
|
| + }
|
| +
|
| + @Override
|
| + public void widgetSelected(SelectionEvent e) {
|
| + close();
|
| + }
|
| + });
|
| + }
|
| +
|
| + @Override
|
| + protected Control createDialogArea(Composite parent) {
|
| + Composite container = (Composite) super.createDialogArea(parent);
|
| + container.setLayout(new GridLayout(2, false));
|
| +
|
| + descriptionLabel = new Link(container, SWT.WRAP);
|
| + GridData gd_descriptionLabel = new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1);
|
| + gd_descriptionLabel.verticalIndent = 20;
|
| + gd_descriptionLabel.horizontalIndent = 20;
|
| + descriptionLabel.setLayoutData(gd_descriptionLabel);
|
| + descriptionLabel.setText("Unable to access the web server"
|
| + + " on the developer machine from the mobile device.\n\n"
|
| + + "Looks like port forwarding has not been setup between device and the machine.\n"
|
| + + "Follow the steps listed under " //
|
| + + " <a href=\"" + MobileMainTab.MOBILE_DOC_URL + "\">Set up port forwarding</a>\n"
|
| + + "\n\nOnce you are done, use Test Connection to verify the setup.");
|
| + descriptionLabel.addSelectionListener(new SelectionListener() {
|
| + @Override
|
| + public void widgetDefaultSelected(SelectionEvent e) {
|
| + widgetSelected(e);
|
| + }
|
| +
|
| + @Override
|
| + public void widgetSelected(SelectionEvent e) {
|
| + ExternalBrowserUtil.openInExternalBrowser(e.text.trim());
|
| + }
|
| + });
|
| +
|
| + return container;
|
| + }
|
| +
|
| + /**
|
| + * Return the initial size of the dialog.
|
| + */
|
| + @Override
|
| + protected Point getInitialSize() {
|
| + return getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT);
|
| + }
|
| +
|
| + /**
|
| + * Test the connection between the mobile device and the webserver on the development machine.
|
| + */
|
| + private void testConnection() {
|
| + testResultLabel.setText("Testing connection...");
|
| +
|
| + // Test connection on a background thread
|
| + Thread thread = new Thread("Test Mobile Port Forwarding") {
|
| +
|
| + @Override
|
| + public void run() {
|
| + long startTime = System.currentTimeMillis();
|
| +
|
| + // Test connection from mobile device to developer machine
|
| + final IStatus status = testConnectionInBackground();
|
| +
|
| + // Ensure text is visible for at least 1 1/2 seconds
|
| + long delta = startTime + 1500 - System.currentTimeMillis();
|
| + if (delta > 0) {
|
| + try {
|
| + Thread.sleep(delta);
|
| + } catch (InterruptedException e) {
|
| + //$FALL-THROUGH$
|
| + }
|
| + }
|
| +
|
| + getShell().getDisplay().asyncExec(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + String message;
|
| + if (status.isOK()) {
|
| + message = "Connection validated";
|
| + } else {
|
| + message = status.getMessage();
|
| + }
|
| + if (message.startsWith(ConnectException.class.getName())) {
|
| + message = message.substring(ConnectException.class.getName().length() + 2).trim();
|
| + }
|
| + testResultLabel.setText(message);
|
| + }
|
| + });
|
| + }
|
| + };
|
| + thread.setDaemon(true);
|
| + thread.start();
|
| + }
|
| +
|
| + private IStatus testConnectionInBackground() {
|
| + AndroidDebugBridge debugBridge = AndroidDebugBridge.getAndroidDebugBridge();
|
| +
|
| + // Check that the device is still connected and authorized
|
| + AndroidDevice device = debugBridge.getConnectedDevice();
|
| + if (device == null) {
|
| + return new Status(IStatus.ERROR, DartCore.PLUGIN_ID, "No device connected");
|
| + }
|
| + if (!device.isAuthorized()) {
|
| + return new Status(IStatus.ERROR, DartCore.PLUGIN_ID, "Connected device is not authorized");
|
| + }
|
| +
|
| + return debugBridge.isHtmlPageAccessible(device, pageUrl);
|
| + }
|
| +}
|
|
|
| Property changes on: dart/editor/tools/plugins/com.google.dart.tools.debug.ui/src/com/google/dart/tools/debug/ui/internal/dialogs/MobilePortForwardDialog.java
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|