/* * 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; } }