Merge "Manifest XML completion of minimum SDK"
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestContentAssist.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestContentAssist.java
index 1c92309..64b22a2 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestContentAssist.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/manifest/ManifestContentAssist.java
@@ -16,9 +16,23 @@
 
 package com.android.ide.eclipse.adt.internal.editors.manifest;
 
+import static com.android.sdklib.xml.AndroidManifest.ATTRIBUTE_MIN_SDK_VERSION;
+
 import com.android.annotations.VisibleForTesting;
 import com.android.ide.eclipse.adt.internal.editors.AndroidContentAssist;
 import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
+import com.android.ide.eclipse.adt.internal.sdk.Sdk;
+import com.android.sdklib.AndroidVersion;
+import com.android.sdklib.IAndroidTarget;
+import com.android.util.Pair;
+
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.w3c.dom.Node;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Content Assist Processor for AndroidManifest.xml
@@ -32,4 +46,54 @@
     public ManifestContentAssist() {
         super(AndroidTargetData.DESCRIPTOR_MANIFEST);
     }
+
+    @Override
+    protected void computeAttributeValues(List<ICompletionProposal> proposals, int offset,
+            String parentTagName, String attributeName, Node node, String wordPrefix,
+            boolean skipEndTag, int replaceLength) {
+        if (attributeName.endsWith(':' + ATTRIBUTE_MIN_SDK_VERSION)) {
+            // The user is completing the minSdkVersion attribute: it should be
+            // an integer for the API version, but we'll add full Android version
+            // names to make it more obvious what they're selecting
+
+            List<Pair<String, String>> choices = new ArrayList<Pair<String, String>>();
+            // Max: Look up what versions I have
+            IAndroidTarget[] targets = Sdk.getCurrent().getTargets();
+            Map<String, IAndroidTarget> versionMap = new HashMap<String, IAndroidTarget>();
+            List<String> codeNames = new ArrayList<String>();
+            int maxVersion = 1;
+            for (IAndroidTarget target : targets) {
+                AndroidVersion version = target.getVersion();
+                int apiLevel = version.getApiLevel();
+                String key;
+                if (version.isPreview()) {
+                    key = version.getCodename();
+                    codeNames.add(key);
+                    apiLevel--;
+                } else {
+                    key = Integer.toString(apiLevel);
+                }
+                if (apiLevel > maxVersion) {
+                    maxVersion = apiLevel;
+                }
+
+                versionMap.put(key, target);
+            }
+            for (String codeName : codeNames) {
+                choices.add(Pair.<String, String>of(codeName, null));
+            }
+            for (int i = maxVersion; i >= 1; i--) {
+                IAndroidTarget target = versionMap.get(Integer.toString(i));
+                String version = target != null ? target.getFullName() : null;
+                choices.add(Pair.of(Integer.toString(i), version));
+            }
+            char needTag = 0;
+            addMatchingProposals(proposals, choices.toArray(), offset, node, wordPrefix,
+                    needTag, true /* isAttribute */, false /* isNew */,
+                    skipEndTag /* skipEndTag */, replaceLength);
+        } else {
+            super.computeAttributeValues(proposals, offset, parentTagName, attributeName, node,
+                    wordPrefix, skipEndTag, replaceLength);
+        }
+    }
 }
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssistTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssistTest.java
index 8590b89..1b3cb3e 100644
--- a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssistTest.java
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/AndroidContentAssistTest.java
@@ -461,6 +461,11 @@
         checkResourceCompletion("completionvalues1.xml", "[^false]");
     }
 
+    public void testCompletion69() throws Exception {
+        // Test minimum SDK completion
+        checkManifestCompletion("manifest.xml", "<uses-sdk android:minSdkVersion=\"^11\" />");
+    }
+
     // ---- Test *applying* code completion ----
 
 
diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion69.txt b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion69.txt
new file mode 100644
index 0000000..382011e
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.tests/src/com/android/ide/eclipse/adt/internal/editors/layout/refactoring/testdata/manifest-expected-completion69.txt
@@ -0,0 +1,26 @@
+Code completion in manifest.xml for <uses-sdk android:minSdkVersion="^11" />:
+AOSP
+14 : Android 4.0.1
+13 : Android 3.2
+12 : Android 3.1
+11 : Android 3.0
+10
+9 : Android 2.3
+8 : Android 2.2
+7
+6
+5 : Android 2.0
+4 : Android 1.6
+3 : Android 1.5
+2 : Android 1.1
+1
+@string/
+@android:
+@+id/
+@anim/
+@animator/
+@color/
+@drawable/
+@id/
+@layout/
+@style/