SDK Manager: Display error when saving settings

SDK BUG 2226029

Change-Id: I568c71b80bddb5c4409df0bd1b02e35b82d6d1ba
diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SettingsController.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SettingsController.java
index e12611c..fe94d86 100755
--- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SettingsController.java
+++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SettingsController.java
@@ -18,9 +18,15 @@
 

 import com.android.prefs.AndroidLocation;

 import com.android.prefs.AndroidLocation.AndroidLocationException;

+import com.android.sdklib.ISdkLog;

+

+import org.eclipse.jface.dialogs.MessageDialog;

+import org.eclipse.swt.widgets.Display;

+import org.eclipse.swt.widgets.Shell;

 

 import java.io.File;

 import java.io.FileInputStream;

+import java.io.FileNotFoundException;

 import java.io.FileOutputStream;

 import java.io.IOException;

 import java.util.Properties;

@@ -40,7 +46,10 @@
 

     private ISettingsPage mSettingsPage;

 

-    public SettingsController() {

+    private final UpdaterData mUpdaterData;

+

+    public SettingsController(UpdaterData updaterData) {

+        mUpdaterData = updaterData;

     }

 

     //--- Access to settings ------------

@@ -144,9 +153,11 @@
      */

     public void loadSettings() {

         FileInputStream fis = null;

+        String path = null;

         try {

             String folder = AndroidLocation.getFolder();

             File f = new File(folder, SETTINGS_FILENAME);

+            path = f.getPath();

             if (f.exists()) {

                 fis = new FileInputStream(f);

 

@@ -157,10 +168,11 @@
                 setSetting(ISettingsPage.KEY_ASK_ADB_RESTART, getAskBeforeAdbRestart());

             }

 

-        } catch (AndroidLocationException e) {

-            e.printStackTrace();

-        } catch (IOException e) {

-            e.printStackTrace();

+        } catch (Exception e) {

+            ISdkLog log = mUpdaterData.getSdkLog();

+            if (log != null) {

+                log.error(e, "Failed to load settings from '%1$s'", path);

+            }

         } finally {

             if (fis != null) {

                 try {

@@ -177,18 +189,42 @@
     public void saveSettings() {

 

         FileOutputStream fos = null;

+        String path = null;

         try {

             String folder = AndroidLocation.getFolder();

             File f = new File(folder, SETTINGS_FILENAME);

+            path = f.getPath();

 

             fos = new FileOutputStream(f);

 

             mProperties.store( fos, "## Settings for Android Tool");  //$NON-NLS-1$

 

-        } catch (AndroidLocationException e) {

-            e.printStackTrace();

-        } catch (IOException e) {

-            e.printStackTrace();

+        } catch (Exception e) {

+            ISdkLog log = mUpdaterData.getSdkLog();

+

+            if (log != null) {

+                log.error(e, "Failed to save settings at '%1$s'", path);

+            }

+

+            // This is important enough that we want to really nag the user about it

+            String reason = null;

+

+            if (e instanceof FileNotFoundException) {

+                reason = "File not found";

+            } else if (e instanceof AndroidLocationException) {

+                reason = ".android folder not found, please define ANDROID_SDK_HOME";

+            } else if (e.getMessage() != null) {

+                reason = String.format("%1$s: %2$s", e.getClass().getSimpleName(), e.getMessage());

+            } else {

+                reason = e.getClass().getName();

+            }

+

+            MessageDialog.openInformation(mUpdaterData.getWindowShell(),

+                    "SDK Manager Settings",

+                    String.format(

+                        "The Android SDK and AVD Manager failed to save its settings (%1$s) at %2$s",

+                        reason, path));

+

         } finally {

             if (fos != null) {

                 try {

@@ -202,7 +238,7 @@
     /**

      * When settings have changed: retrieve the new settings, apply them and save them.

      *

-     * This updats Java system properties for the HTTP proxy.

+     * This updates Java system properties for the HTTP proxy.

      */

     private void onSettingsChanged() {

         if (mSettingsPage == null) {

diff --git a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
index ec55c26..ed6c6e2 100755
--- a/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
+++ b/tools/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java
@@ -64,7 +64,7 @@
 

     private ImageFactory mImageFactory;

 

-    private final SettingsController mSettingsController = new SettingsController();

+    private final SettingsController mSettingsController;

 

     private final ArrayList<ISdkListener> mListeners = new ArrayList<ISdkListener>();

 

@@ -74,6 +74,8 @@
         mOsSdkRoot = osSdkRoot;

         mSdkLog = sdkLog;

 

+        mSettingsController = new SettingsController(this);

+

         initSdk();

     }