Merge "Making SDK path editing in SDK manager actually work" into studio-1.4-dev
automerge: c52dd60

* commit 'c52dd6072e936aac0773572713b48e788a26b829':
  Making SDK path editing in SDK manager actually work
diff --git a/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigPanel.form b/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigPanel.form
index e6e1eac..1677973 100644
--- a/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigPanel.form
+++ b/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigPanel.form
@@ -16,7 +16,7 @@
           <text value="Manager for the Android SDK and Tools used by Android Studio"/>
         </properties>
       </component>
-      <grid id="7bcd0" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+      <grid id="7bcd0" layout-manager="GridLayoutManager" row-count="1" column-count="4" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
         <margin top="0" left="0" bottom="0" right="0"/>
         <constraints>
           <grid row="1" column="0" row-span="1" col-span="3" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
@@ -24,9 +24,9 @@
         <properties/>
         <border type="none"/>
         <children>
-          <component id="ff1ec" class="com.intellij.openapi.ui.TextFieldWithBrowseButton" binding="mySdkLocation">
+          <component id="38898" class="javax.swing.JTextField" binding="mySdkLocation">
             <constraints>
-              <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+              <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
             </constraints>
             <properties/>
           </component>
@@ -35,9 +35,21 @@
               <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
             </constraints>
             <properties>
+              <enabled value="false"/>
               <text value="Android SDK Location:"/>
             </properties>
           </component>
+          <component id="469be" class="com.intellij.ui.HyperlinkLabel" binding="myEditSdkLink">
+            <constraints>
+              <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="3" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties/>
+          </component>
+          <hspacer id="3b2ca">
+            <constraints>
+              <grid row="0" column="3" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+            </constraints>
+          </hspacer>
         </children>
       </grid>
       <tabbedpane id="46ef2" class="com.intellij.ui.components.JBTabbedPane" default-binding="true">
diff --git a/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigPanel.java b/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigPanel.java
index 0c7ef85..88de682 100644
--- a/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigPanel.java
+++ b/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigPanel.java
@@ -30,14 +30,18 @@
 import com.google.common.collect.TreeMultimap;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.options.ShowSettingsUtil;
-import com.intellij.openapi.ui.TextFieldWithBrowseButton;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.ui.InputValidator;
+import com.intellij.openapi.ui.Messages;
 import com.intellij.openapi.updateSettings.impl.UpdateSettingsConfigurable;
+import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.ui.HyperlinkAdapter;
 import com.intellij.ui.HyperlinkLabel;
 import com.intellij.ui.dualView.TreeTableView;
 import com.intellij.ui.table.SelectionProvider;
 import com.intellij.util.ui.tree.TreeUtil;
 import org.jetbrains.android.actions.RunAndroidSdkManagerAction;
+import org.jetbrains.android.sdk.AndroidSdkData;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import sun.awt.CausedFocusEvent;
@@ -50,6 +54,7 @@
 import javax.swing.tree.TreePath;
 import java.awt.*;
 import java.awt.event.*;
+import java.io.File;
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
@@ -59,12 +64,13 @@
  */
 public class SdkUpdaterConfigPanel {
   private JPanel myRootPane;
-  private TextFieldWithBrowseButton mySdkLocation;
+  private JTextField mySdkLocation;
   private PlatformComponentsPanel myPlatformComponentsPanel;
   private ToolComponentsPanel myToolComponentsPanel;
   private UpdateSitesPanel myUpdateSitesPanel;
   private HyperlinkLabel myLaunchStandaloneLink;
   private HyperlinkLabel myChannelLink;
+  private HyperlinkLabel myEditSdkLink;
   private SdkSources mySdkSources;
   private Runnable mySourcesChangeListener = new DispatchRunnable() {
     @Override
@@ -73,7 +79,7 @@
     }
   };
 
-  private final SdkState mySdkState;
+  private SdkState mySdkState;
   private boolean myHasPreview;
   private boolean myIncludePreview;
 
@@ -96,7 +102,6 @@
     mySdkSources = mySdkState.getRemoteSdk().fetchSources(RemoteSdk.DEFAULT_EXPIRATION_PERIOD_MS, logger);
     mySdkSources.addChangeListener(mySourcesChangeListener);
     myUpdateSitesPanel.setSdkState(sdkState);
-    mySdkLocation.setText(IdeSdks.getAndroidSdkPath().getPath());
     myLaunchStandaloneLink.setHyperlinkText("Launch Standalone SDK Manager");
     myLaunchStandaloneLink.addHyperlinkListener(new HyperlinkAdapter() {
       @Override
@@ -114,6 +119,26 @@
         channelChangedCallback.run();
       }
     });
+    myEditSdkLink.setHyperlinkText("Edit");
+    myEditSdkLink.addHyperlinkListener(new HyperlinkAdapter() {
+      @Override
+      protected void hyperlinkActivated(HyperlinkEvent e) {
+        String newLocation = Messages
+          .showInputDialog(getComponent(), "New SDK Location:", "Set SDK Location", null, mySdkLocation.getText(), new InputValidator() {
+            @Override
+            public boolean checkInput(String inputString) {
+              return IdeSdks.isValidAndroidSdkPath(new File(inputString));
+            }
+
+            @Override
+            public boolean canClose(String inputString) {
+              return checkInput(inputString);
+            }
+          });
+        setSdkPath(newLocation);
+      }
+    });
+    mySdkLocation.setEditable(false);
   }
 
   public void setIncludePreview(boolean includePreview) {
@@ -123,10 +148,6 @@
     myToolComponentsPanel.setIncludePreview(includePreview);
   }
 
-  public String getSdkPath() {
-    return mySdkLocation.getText();
-  }
-
   public JComponent getComponent() {
     return myRootPane;
   }
@@ -269,6 +290,7 @@
 
   public void reset() {
     refresh();
+    mySdkLocation.setText(IdeSdks.getAndroidSdkPath().getPath());
     myPlatformComponentsPanel.reset();
     myToolComponentsPanel.reset();
     myUpdateSitesPanel.reset();
@@ -282,6 +304,27 @@
     myUpdateSitesPanel.save();
   }
 
+  private void setSdkPath(String newLocation) {
+    final File currentPath = IdeSdks.getAndroidSdkPath();
+    assert currentPath != null;  // shouldn't be able to get to this point without sdk set.
+    final File newPath = new File(newLocation);
+    assert IdeSdks.isValidAndroidSdkPath(newPath);
+
+    if (FileUtil.filesEqual(currentPath, newPath)) {
+      return;
+    }
+
+    List<Sdk> sdks = IdeSdks.setAndroidSdkPath(newPath, null);
+    if (sdks.isEmpty()) {
+      Messages.showErrorDialog(getComponent(), "Failed to set SDK path");
+    }
+    else {
+      mySdkState = SdkState.getInstance(AndroidSdkData.getSdkData(newPath));
+      mySdkLocation.setText(newPath.getAbsolutePath());
+      refresh();
+    }
+  }
+
   private static class CycleAction extends AbstractAction {
     boolean myBackward;
 
diff --git a/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigurable.java b/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigurable.java
index 998d08e..433f307 100644
--- a/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigurable.java
+++ b/sdk-updates/src/com/android/tools/idea/updater/configure/SdkUpdaterConfigurable.java
@@ -16,7 +16,6 @@
 package com.android.tools.idea.updater.configure;
 
 import com.android.sdklib.repository.descriptors.IPkgDesc;
-import com.android.tools.idea.sdk.IdeSdks;
 import com.android.tools.idea.sdk.SdkState;
 import com.android.tools.idea.sdk.remote.UpdatablePkgInfo;
 import com.android.tools.idea.sdk.wizard.SdkQuickfixWizard;
@@ -24,7 +23,6 @@
 import com.android.utils.HtmlBuilder;
 import com.google.common.collect.Lists;
 import com.intellij.icons.AllIcons;
-import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.options.ConfigurationException;
 import com.intellij.openapi.options.SearchableConfigurable;
 import com.intellij.openapi.project.Project;
@@ -40,7 +38,6 @@
 
 import javax.swing.*;
 import javax.swing.event.AncestorEvent;
-import java.io.File;
 import java.util.List;
 
 /**
@@ -116,15 +113,6 @@
 
   @Override
   public void apply() throws ConfigurationException {
-    if (!IdeSdks.getAndroidSdkPath().getPath().equals(myPanel.getSdkPath())) {
-      ApplicationManager.getApplication().runWriteAction(new Runnable() {
-        @Override
-        public void run() {
-          IdeSdks.setAndroidSdkPath(new File(myPanel.getSdkPath()), null);
-        }
-      });
-    }
-
     myPanel.saveSources();
 
     HtmlBuilder message = new HtmlBuilder();