blob: f9856cc01acd500d1f610122d4577d1be34143cd [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.sdkstats;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.program.Program;
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.io.IOException;
/**
* Dialog to get user permission for ping service.
*/
public class SdkStatsPermissionDialog extends Dialog {
/* Text strings displayed in the opt-out dialog. */
private static final String HEADER_TEXT =
"Thanks for using the Android SDK!";
/** Used in the ADT welcome wizard as well. */
public static final String NOTICE_TEXT =
"We know you just want to get started but please read this first.";
/** Used in the preference pane (PrefsDialog) as well. */
public static final String BODY_TEXT =
"By choosing to send certain usage statistics to Google, you can " +
"help us improve the Android SDK. These usage statistics lets us " +
"measure things like active usage of the SDK, and let us know things " +
"like which versions of the SDK are in use and which tools are the " +
"most popular with developers. This limited data is not associated " +
"with personal information about you, and is examined on an aggregate " +
"basis, and is maintained in accordance with the Google Privacy Policy.";
/** Used in the ADT welcome wizard as well. */
public static final String PRIVACY_POLICY_LINK_TEXT =
"<a href=\"http://www.google.com/intl/en/privacy.html\">Google " +
"Privacy Policy</a>";
/** Used in the preference pane (PrefsDialog) as well. */
public static final String CHECKBOX_TEXT =
"Send usage statistics to Google.";
/** Used in the ADT welcome wizard as well. */
public static final String FOOTER_TEXT =
"If you later decide to change this setting, you can do so in the" +
"\"ddms\" tool under \"File\" > \"Preferences\" > \"Usage Stats\".";
private static final String BUTTON_TEXT = "Proceed";
/** List of Linux browser commands to try, in order (see openUrl). */
private static final String[] LINUX_BROWSERS = new String[] {
"firefox -remote openurl(%URL%,new-window)", //$NON-NLS-1$ running FF
"mozilla -remote openurl(%URL%,new-window)", //$NON-NLS-1$ running Moz
"firefox %URL%", //$NON-NLS-1$ new FF
"mozilla %URL%", //$NON-NLS-1$ new Moz
"kfmclient openURL %URL%", //$NON-NLS-1$ Konqueror
"opera -newwindow %URL%", //$NON-NLS-1$ Opera
};
private static final boolean ALLOW_PING_DEFAULT = true;
private boolean mAllowPing = ALLOW_PING_DEFAULT;
public SdkStatsPermissionDialog(Shell parentShell) {
super(parentShell);
setBlockOnOpen(true);
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, Window.OK, BUTTON_TEXT, true);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
composite.setLayout(new GridLayout(1, false));
final Label title = new Label(composite, SWT.CENTER | SWT.WRAP);
final FontData[] fontdata = title.getFont().getFontData();
for (int i = 0; i < fontdata.length; i++) {
fontdata[i].setHeight(fontdata[i].getHeight() * 4 / 3);
}
title.setFont(new Font(getShell().getDisplay(), fontdata));
title.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
title.setText(HEADER_TEXT);
final Label notice = new Label(composite, SWT.WRAP);
notice.setFont(title.getFont());
notice.setForeground(new Color(getShell().getDisplay(), 255, 0, 0));
notice.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
notice.setText(NOTICE_TEXT);
notice.pack();
final Label bodyText = new Label(composite, SWT.WRAP);
GridData gd = new GridData();
gd.widthHint = notice.getSize().x; // do not extend beyond the NOTICE text's width
gd.grabExcessHorizontalSpace = true;
bodyText.setLayoutData(gd);
bodyText.setText(BODY_TEXT);
final Link privacyLink = new Link(composite, SWT.NO_FOCUS);
privacyLink.setText(PRIVACY_POLICY_LINK_TEXT);
privacyLink.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
openUrl(event.text);
}
});
final Button checkbox = new Button(composite, SWT.CHECK);
checkbox.setSelection(ALLOW_PING_DEFAULT);
checkbox.setText(CHECKBOX_TEXT);
checkbox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
mAllowPing = checkbox.getSelection();
}
});
checkbox.setFocus();
final Label footer = new Label(composite, SWT.WRAP);
gd = new GridData();
gd.widthHint = notice.getSize().x;
gd.grabExcessHorizontalSpace = true;
footer.setLayoutData(gd);
footer.setText(FOOTER_TEXT);
return composite;
}
/**
* Open a URL in an external browser.
* @param url to open - MUST be sanitized and properly formed!
*/
public static void openUrl(final String url) {
// TODO: consider using something like BrowserLauncher2
// (http://browserlaunch2.sourceforge.net/) instead of these hacks.
// SWT's Program.launch() should work on Mac, Windows, and GNOME
// (because the OS shell knows how to launch a default browser).
if (!Program.launch(url)) {
// Must be Linux non-GNOME (or something else broke).
// Try a few Linux browser commands in the background.
new Thread() {
@Override
public void run() {
for (String cmd : LINUX_BROWSERS) {
cmd = cmd.replaceAll("%URL%", url); //$NON-NLS-1$
try {
Process proc = Runtime.getRuntime().exec(cmd);
if (proc.waitFor() == 0) break; // Success!
} catch (InterruptedException e) {
// Should never happen!
throw new RuntimeException(e);
} catch (IOException e) {
// Swallow the exception and try the next browser.
}
}
// TODO: Pop up some sort of error here?
// (We're in a new thread; can't use the existing Display.)
}
}.start();
}
}
public boolean getPingUserPreference() {
return mAllowPing;
}
}