diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizard.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizard.java | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizard.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizard.java new file mode 100644 index 000000000..916924e99 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/WelcomeWizard.java @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php + * + * 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.ide.eclipse.adt.internal.welcome; + +import com.android.ide.eclipse.adt.AdtPlugin; +import com.android.ide.eclipse.adt.internal.preferences.AdtPrefs; +import com.android.ide.eclipse.adt.internal.sdk.AdtConsoleSdkLog; +import com.android.sdkstats.DdmsPreferenceStore; +import com.android.sdkuilib.internal.repository.ui.AdtUpdateDialog; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +/** + * Wizard shown on first start for new users: configure SDK location, accept or + * reject usage data collection, etc + */ +public class WelcomeWizard extends Wizard { + private final DdmsPreferenceStore mStore; + + private WelcomeWizardPage mWelcomePage; + private UsagePermissionPage mUsagePage; + + private final boolean mShowWelcomePage; + private final boolean mShowUsagePage; + + /** + * Creates a new {@link WelcomeWizard} + * + * @param store preferences for usage statistics collection etc + * @param showInstallSdkPage show page to install SDK's + * @param showUsageOptinPage show page to get user consent for usage data collection + */ + public WelcomeWizard(DdmsPreferenceStore store, boolean showInstallSdkPage, + boolean showUsageOptinPage) { + mStore = store; + mShowWelcomePage = showInstallSdkPage; + mShowUsagePage = showUsageOptinPage; + + setWindowTitle("Welcome to Android Development"); + ImageDescriptor image = AdtPlugin.getImageDescriptor("icons/android-64.png"); //$NON-NLS-1$ + setDefaultPageImageDescriptor(image); + } + + @Override + public void addPages() { + if (mShowWelcomePage) { + mWelcomePage = new WelcomeWizardPage(); + addPage(mWelcomePage); + } + + // It's possible that the user has already run the command line tools + // such as ddms and has agreed to usage statistics collection, but has never + // run ADT which is why the wizard was opened. No need to ask again. + if (mShowUsagePage && !mStore.hasPingId()) { + mUsagePage = new UsagePermissionPage(); + addPage(mUsagePage); + } + } + + @Override + public boolean performFinish() { + if (mUsagePage != null) { + boolean isUsageCollectionApproved = mUsagePage.isUsageCollectionApproved(); + DdmsPreferenceStore store = new DdmsPreferenceStore(); + + // Workaround: Store a new ping id if one doesn't exist, regardless of + // whether usage statistics gathering is enabled, to ensure that ddms and + // ADT agree upon whether usage data collection is enabled. The reason this + // is necessary is that the Eclipse PreferenceStore optimizes out writing + // property values that equal their default values, and in our case, the + // default value for usage-collection is "false", so it just doesn't write + // it into the config file is the user opts out - which means that nothing + // is written in ddms.config. That works in the sense that the getter returns + // "usage collection"=false, but it doesn't work in the sense that it looks + // like the property has not yet been decided by the user. DDMS will look at + // the existence of a ping id to see whether we've already considered the + // question, so do the same here. + if (!store.hasPingId()) { + store.generateNewPingId(); + } + + store.setPingOptIn(isUsageCollectionApproved); + } + + if (mWelcomePage != null) { + // Read out wizard settings immediately; we will perform the actual work + // after the wizard window has been taken down and it's too late to read the + // settings then + final File path = mWelcomePage.getPath(); + final boolean installCommon = mWelcomePage.isInstallCommon(); + final boolean installLatest = mWelcomePage.isInstallLatest(); + final boolean createNew = mWelcomePage.isCreateNew(); + + // Perform installation asynchronously since it takes a while. + getShell().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + if (createNew) { + try { + Set<Integer> apiLevels = new HashSet<Integer>(); + if (installCommon) { + apiLevels.add(8); + } + if (installLatest) { + apiLevels.add(AdtUpdateDialog.USE_MAX_REMOTE_API_LEVEL); + } + installSdk(path, apiLevels); + } catch (Exception e) { + AdtPlugin.logAndPrintError(e, "ADT Welcome Wizard", + "Installation failed"); + } + } + + // Set SDK path after installation since this will trigger a SDK refresh. + AdtPrefs.getPrefs().setSdkLocation(path); + } + }); + } + + // The wizard always succeeds, even if installation fails or is aborted + return true; + } + + /** + * Trigger the install window. It will connect to the repository, display + * a confirmation window showing which packages are selected for install + * and display a progress dialog during installation. + */ + private boolean installSdk(File path, Set<Integer> apiLevels) { + if (!path.isDirectory()) { + if (!path.mkdirs()) { + AdtPlugin.logAndPrintError(null, "ADT Welcome Wizard", + "Failed to create directory %1$s", + path.getAbsolutePath()); + return false; + } + } + + // Get a shell to use for the SDK installation. There are cases where getActiveShell + // returns null so attempt to obtain it through other means. + Display display = AdtPlugin.getDisplay(); + Shell shell = display.getActiveShell(); + if (shell == null) { + IWorkbench workbench = PlatformUI.getWorkbench(); + IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); + if (window != null) { + shell = window.getShell(); + } + } + boolean disposeShell = false; + if (shell == null) { + shell = new Shell(display); + AdtPlugin.log(IStatus.WARNING, "No parent shell for SDK installation dialog"); + disposeShell = true; + } + + AdtUpdateDialog updater = new AdtUpdateDialog( + shell, + new AdtConsoleSdkLog(), + path.getAbsolutePath()); + // Note: we don't have to specify tools & platform-tools since they + // are required dependencies of any platform. + boolean result = updater.installNewSdk(apiLevels); + + // TODO: Install extra package here as well since it is now core to most of + // the templates + // if (result) { + // updater.installExtraPackage(vendor, path); + // } + + if (disposeShell) { + shell.dispose(); + } + + if (!result) { + AdtPlugin.printErrorToConsole("Failed to install Android SDK."); + return false; + } + + return true; + } +} |