aboutsummaryrefslogtreecommitdiffstats
path: root/common/src/com/android/prefs/AndroidLocation.java
diff options
context:
space:
mode:
Diffstat (limited to 'common/src/com/android/prefs/AndroidLocation.java')
-rw-r--r--common/src/com/android/prefs/AndroidLocation.java116
1 files changed, 116 insertions, 0 deletions
diff --git a/common/src/com/android/prefs/AndroidLocation.java b/common/src/com/android/prefs/AndroidLocation.java
new file mode 100644
index 0000000..c36048a
--- /dev/null
+++ b/common/src/com/android/prefs/AndroidLocation.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2008 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.prefs;
+
+import java.io.File;
+
+/**
+ * Manages the location of the android files (including emulator files, ddms config, debug keystore)
+ */
+public final class AndroidLocation {
+ /**
+ * Virtual Device folder inside the path returned by {@link #getFolder()}
+ */
+ public static final String FOLDER_AVD = "avd";
+
+ /**
+ * Throw when the location of the android folder couldn't be found.
+ */
+ public static final class AndroidLocationException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ public AndroidLocationException(String string) {
+ super(string);
+ }
+ }
+
+ private static String sPrefsLocation = null;
+
+ /**
+ * Returns the folder used to store android related files.
+ * @return an OS specific path, terminated by a separator.
+ * @throws AndroidLocationException
+ */
+ public final static String getFolder() throws AndroidLocationException {
+ if (sPrefsLocation == null) {
+ String home = findValidPath("ANDROID_SDK_HOME", "user.home", "HOME");
+
+ // if the above failed, we throw an exception.
+ if (home == null) {
+ throw new AndroidLocationException(
+ "Unable to get the Android SDK home directory.\n" +
+ "Make sure the environment variable ANDROID_SDK_HOME is set up.");
+ } else {
+ sPrefsLocation = home + File.separator + ".android" + File.separator;
+ }
+ }
+
+ // make sure the folder exists!
+ File f = new File(sPrefsLocation);
+ if (f.exists() == false) {
+ try {
+ f.mkdir();
+ } catch (SecurityException e) {
+ AndroidLocationException e2 = new AndroidLocationException(String.format(
+ "Unable to create folder '%1$s'. " +
+ "This is the path of preference folder expected by the Android tools.",
+ sPrefsLocation));
+ e2.initCause(e);
+ throw e2;
+ }
+ } else if (f.isFile()) {
+ throw new AndroidLocationException(sPrefsLocation +
+ " is not a directory! " +
+ "This is the path of preference folder expected by the Android tools.");
+ }
+
+ return sPrefsLocation;
+ }
+
+ /**
+ * Resets the folder used to store android related files. For testing.
+ */
+ public final static void resetFolder() {
+ sPrefsLocation = null;
+ }
+
+ /**
+ * Checks a list of system properties and/or system environment variables for validity, and
+ * existing director, and returns the first one.
+ * @param names
+ * @return the content of the first property/variable.
+ */
+ private static String findValidPath(String... names) {
+ for (String name : names) {
+ String path;
+ if (name.indexOf('.') != -1) {
+ path = System.getProperty(name);
+ } else {
+ path = System.getenv(name);
+ }
+
+ if (path != null) {
+ File f = new File(path);
+ if (f.isDirectory()) {
+ return path;
+ }
+ }
+ }
+
+ return null;
+ }
+}