aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportedProject.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportedProject.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportedProject.java256
1 files changed, 256 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportedProject.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportedProject.java
new file mode 100644
index 000000000..74af651ca
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/ImportedProject.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2012 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.wizards.newproject;
+
+import static com.android.SdkConstants.ATTR_NAME;
+
+import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
+import com.android.ide.common.xml.AndroidManifestParser;
+import com.android.ide.common.xml.ManifestData;
+import com.android.ide.common.xml.ManifestData.Activity;
+import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.ide.eclipse.adt.internal.editors.layout.gle2.DomUtilities;
+import com.android.ide.eclipse.adt.internal.sdk.Sdk;
+import com.android.io.FolderWrapper;
+import com.android.sdklib.AndroidVersion;
+import com.android.sdklib.IAndroidTarget;
+import com.android.sdklib.internal.project.ProjectProperties;
+import com.android.sdklib.internal.project.ProjectProperties.PropertyType;
+import com.google.common.base.Charsets;
+import com.google.common.io.Files;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/** An Android project to be imported */
+class ImportedProject {
+ private final File mLocation;
+ private String mActivityName;
+ private ManifestData mManifest;
+ private String mProjectName;
+ private String mRelativePath;
+
+ ImportedProject(File location, String relativePath) {
+ super();
+ mLocation = location;
+ mRelativePath = relativePath;
+ }
+
+ File getLocation() {
+ return mLocation;
+ }
+
+ String getRelativePath() {
+ return mRelativePath;
+ }
+
+ @Nullable
+ ManifestData getManifest() {
+ if (mManifest == null) {
+ try {
+ mManifest = AndroidManifestParser.parse(new FolderWrapper(mLocation));
+ } catch (SAXException e) {
+ // Some sort of error in the manifest file: report to the user in a better way?
+ AdtPlugin.log(e, null);
+ return null;
+ } catch (Exception e) {
+ AdtPlugin.log(e, null);
+ return null;
+ }
+ }
+
+ return mManifest;
+ }
+
+ @Nullable
+ public String getActivityName() {
+ if (mActivityName == null) {
+ // Compute the project name and the package name from the manifest
+ ManifestData manifest = getManifest();
+ if (manifest != null) {
+ if (manifest.getLauncherActivity() != null) {
+ mActivityName = manifest.getLauncherActivity().getName();
+ }
+ if (mActivityName == null || mActivityName.isEmpty()) {
+ Activity[] activities = manifest.getActivities();
+ for (Activity activity : activities) {
+ mActivityName = activity.getName();
+ if (mActivityName != null && !mActivityName.isEmpty()) {
+ break;
+ }
+ }
+ }
+ if (mActivityName != null) {
+ int index = mActivityName.lastIndexOf('.');
+ mActivityName = mActivityName.substring(index + 1);
+ }
+ }
+ }
+
+ return mActivityName;
+ }
+
+ @NonNull
+ public String getProjectName() {
+ if (mProjectName == null) {
+ // Are we importing an Eclipse project? If so just use the existing project name
+ mProjectName = findEclipseProjectName();
+ if (mProjectName != null) {
+ return mProjectName;
+ }
+
+ String activityName = getActivityName();
+ if (activityName == null || activityName.isEmpty()) {
+ // I could also look at the build files, say build.xml from ant, and
+ // try to glean the project name from there
+ mProjectName = mLocation.getName();
+ } else {
+ // Try to derive it from the activity name:
+ IWorkspace workspace = ResourcesPlugin.getWorkspace();
+ IStatus nameStatus = workspace.validateName(activityName, IResource.PROJECT);
+ if (nameStatus.isOK()) {
+ mProjectName = activityName;
+ } else {
+ // Try to derive it by escaping characters
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0, n = activityName.length(); i < n; i++) {
+ char c = activityName.charAt(i);
+ if (c != IPath.DEVICE_SEPARATOR && c != IPath.SEPARATOR && c != '\\') {
+ sb.append(c);
+ }
+ }
+ if (sb.length() == 0) {
+ mProjectName = mLocation.getName();
+ } else {
+ mProjectName = sb.toString();
+ }
+ }
+ }
+ }
+
+ return mProjectName;
+ }
+
+ @Nullable
+ private String findEclipseProjectName() {
+ File projectFile = new File(mLocation, ".project"); //$NON-NLS-1$
+ if (projectFile.exists()) {
+ String xml;
+ try {
+ xml = Files.toString(projectFile, Charsets.UTF_8);
+ Document doc = DomUtilities.parseDocument(xml, false);
+ if (doc != null) {
+ NodeList names = doc.getElementsByTagName(ATTR_NAME);
+ if (names.getLength() >= 1) {
+ Node nameElement = names.item(0);
+ String name = nameElement.getTextContent().trim();
+ if (!name.isEmpty()) {
+ return name;
+ }
+ }
+ }
+ } catch (IOException e) {
+ // pass: don't attempt to read project name; must be some sort of unrelated
+ // file with the same name, perhaps from a different editor or IDE
+ }
+ }
+
+ return null;
+ }
+
+ public void setProjectName(@NonNull String newName) {
+ mProjectName = newName;
+ }
+
+ public IAndroidTarget getTarget() {
+ // Pick a target:
+ // First try to find the one requested by project.properties
+ IAndroidTarget[] targets = Sdk.getCurrent().getTargets();
+ ProjectProperties properties = ProjectProperties.load(mLocation.getPath(),
+ PropertyType.PROJECT);
+ if (properties != null) {
+ String targetProperty = properties.getProperty(ProjectProperties.PROPERTY_TARGET);
+ if (targetProperty != null) {
+ Matcher m = Pattern.compile("android-(.+)").matcher( //$NON-NLS-1$
+ targetProperty.trim());
+ if (m.matches()) {
+ String targetName = m.group(1);
+ int targetLevel;
+ try {
+ targetLevel = Integer.parseInt(targetName);
+ } catch (NumberFormatException nufe) {
+ // pass
+ targetLevel = -1;
+ }
+ for (IAndroidTarget t : targets) {
+ AndroidVersion version = t.getVersion();
+ if (version.isPreview() && targetName.equals(version.getCodename())) {
+ return t;
+ } else if (targetLevel == version.getApiLevel()) {
+ return t;
+ }
+ }
+ if (targetLevel > 0) {
+ // If not found, pick the closest one that is higher than the
+ // api level
+ IAndroidTarget target = targets[targets.length - 1];
+ int targetDelta = target.getVersion().getApiLevel() - targetLevel;
+ for (IAndroidTarget t : targets) {
+ int newDelta = t.getVersion().getApiLevel() - targetLevel;
+ if (newDelta >= 0 && newDelta < targetDelta) {
+ targetDelta = newDelta;
+ target = t;
+ }
+ }
+
+ return target;
+ }
+ }
+ }
+ }
+
+ // If not found, pick the closest one to the one requested by the
+ // project (in project.properties) that is still >= the minSdk version
+ IAndroidTarget target = targets[targets.length - 1];
+ ManifestData manifest = getManifest();
+ if (manifest != null) {
+ int minSdkLevel = manifest.getMinSdkVersion();
+ int targetDelta = target.getVersion().getApiLevel() - minSdkLevel;
+ for (IAndroidTarget t : targets) {
+ int newDelta = t.getVersion().getApiLevel() - minSdkLevel;
+ if (newDelta >= 0 && newDelta < targetDelta) {
+ targetDelta = newDelta;
+ target = t;
+ }
+ }
+ }
+
+ return target;
+ }
+} \ No newline at end of file