summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiva Velusamy <vsiva@google.com>2014-08-12 16:21:51 -0700
committerSiva Velusamy <vsiva@google.com>2014-08-18 18:26:23 -0700
commit12c57a6a3ea90917785ee1adcce27fe76c68c668 (patch)
treea76da31f674e88e355092a72efea4d4c19f38cbd
parent0eb0dfd0ff93beb4f90bf494702a08f2c2505c97 (diff)
downloadidea-12c57a6a3ea90917785ee1adcce27fe76c68c668.tar.gz
navigator: Sorting of nodes
Sibling nodes in the navigator view are sorted by their weight, and then by the sort key. This CL provides the appropriate weights and keys for nodes in the Android navigator view. In particular: - Resource Groups and Resource Files should be compared alphabetically. Currently, the groups are all shown at the end. - The Gradle Scripts node is assigned a high enough weight so that it always shows up at the end. Bugs: https://code.google.com/p/android/issues/detail?id=74064 https://code.google.com/p/android/issues/detail?id=74714 Change-Id: Ic4ed3817ac9bc9e398ee826059588df098464523
-rw-r--r--android/src/com/android/tools/idea/navigator/AndroidProjectViewPane.java10
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidBuildScriptNode.java15
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidBuildScriptsGroupNode.java11
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidManifestFileNode.java16
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidManifestsGroupNode.java12
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidModuleNode.java16
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidPsiDirectoryNode.java12
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidResComparator.java92
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidResFileNode.java47
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidResFolderTypeNode.java12
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidResGroupNode.java29
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/AndroidSourceTypeNode.java6
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/NonAndroidModuleNode.java12
-rw-r--r--android/src/com/android/tools/idea/navigator/nodes/NonAndroidSourceTypeNode.java12
-rw-r--r--android/testData/projects/navigator/packageview/simple/app/src/main/res/drawable-mdpi/j.png0
-rw-r--r--android/testSrc/com/android/tools/idea/navigator/AndroidProjectViewTest.java54
16 files changed, 317 insertions, 39 deletions
diff --git a/android/src/com/android/tools/idea/navigator/AndroidProjectViewPane.java b/android/src/com/android/tools/idea/navigator/AndroidProjectViewPane.java
index 5eaad7e3af4..7864ef08b74 100644
--- a/android/src/com/android/tools/idea/navigator/AndroidProjectViewPane.java
+++ b/android/src/com/android/tools/idea/navigator/AndroidProjectViewPane.java
@@ -15,20 +15,24 @@
*/
package com.android.tools.idea.navigator;
-import com.android.tools.idea.navigator.nodes.DirectoryGroupNode;
import com.android.tools.idea.navigator.nodes.AndroidViewProjectNode;
+import com.android.tools.idea.navigator.nodes.DirectoryGroupNode;
import com.google.common.collect.Lists;
import com.intellij.ide.SelectInTarget;
import com.intellij.ide.impl.ProjectPaneSelectInTarget;
import com.intellij.ide.projectView.BaseProjectTreeBuilder;
import com.intellij.ide.projectView.ViewSettings;
-import com.intellij.ide.projectView.impl.*;
+import com.intellij.ide.projectView.impl.AbstractProjectViewPSIPane;
+import com.intellij.ide.projectView.impl.ProjectAbstractTreeStructureBase;
+import com.intellij.ide.projectView.impl.ProjectTreeStructure;
+import com.intellij.ide.projectView.impl.ProjectViewTree;
import com.intellij.ide.projectView.impl.nodes.PackageElement;
import com.intellij.ide.util.treeView.AbstractTreeBuilder;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.ide.util.treeView.AbstractTreeUpdater;
import com.intellij.ide.util.treeView.NodeDescriptor;
-import com.intellij.openapi.actionSystem.*;
+import com.intellij.openapi.actionSystem.CommonDataKeys;
+import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidBuildScriptNode.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidBuildScriptNode.java
index 4671234ff1b..79190b6c243 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/AndroidBuildScriptNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidBuildScriptNode.java
@@ -54,6 +54,21 @@ public class AndroidBuildScriptNode extends PsiFileNode {
@Nullable
@Override
+ public Comparable getSortKey() {
+ // returns qualifer + name
+ // we want to compare by the qualifier first so that build scripts from same module are grouped together
+ PsiFile f = getValue();
+ String name = myQualifier == null ? " (0)" : myQualifier;
+ return f == null ? name : name + f.getName();
+ }
+
+ @Override
+ public Comparable getTypeSortKey() {
+ return getSortKey();
+ }
+
+ @Nullable
+ @Override
public String toTestString(@Nullable Queryable.PrintInfo printInfo) {
String fileName = getValue().getName();
return fileName + (myQualifier == null ? "" : " (" + myQualifier + ")");
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidBuildScriptsGroupNode.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidBuildScriptsGroupNode.java
index 787d7b999c9..08fa258bbaa 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/AndroidBuildScriptsGroupNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidBuildScriptsGroupNode.java
@@ -18,7 +18,6 @@ package com.android.tools.idea.navigator.nodes;
import com.android.SdkConstants;
import com.android.tools.idea.gradle.project.AndroidGradleProjectData;
import com.android.tools.idea.gradle.util.GradleUtil;
-import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.intellij.ide.projectView.PresentationData;
@@ -41,7 +40,10 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
-import java.util.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
public class AndroidBuildScriptsGroupNode extends ProjectViewNode<List<PsiDirectory>> {
public AndroidBuildScriptsGroupNode(@NotNull Project project, @NotNull ViewSettings viewSettings) {
@@ -134,6 +136,11 @@ public class AndroidBuildScriptsGroupNode extends ProjectViewNode<List<PsiDirect
}
@Override
+ public int getWeight() {
+ return 100; // Gradle scripts node should be at the end after all the modules
+ }
+
+ @Override
protected void update(PresentationData presentation) {
presentation.setPresentableText("Gradle Scripts");
presentation.setIcon(GradleIcons.Gradle);
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidManifestFileNode.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidManifestFileNode.java
index 8c936001417..464fcbd6843 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/AndroidManifestFileNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidManifestFileNode.java
@@ -65,6 +65,22 @@ public class AndroidManifestFileNode extends PsiFileNode implements DirectoryGro
return null;
}
+ @Nullable
+ @Override
+ public Comparable getSortKey() {
+ IdeaSourceProvider sourceProvider = getSourceProvider(getValue());
+ if (sourceProvider == null || SdkConstants.FD_MAIN.equals(sourceProvider.getName())) {
+ return "";
+ } else {
+ return sourceProvider.getName();
+ }
+ }
+
+ @Override
+ public Comparable getTypeSortKey() {
+ return getSortKey();
+ }
+
@NotNull
@Override
public PsiDirectory[] getDirectories() {
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidManifestsGroupNode.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidManifestsGroupNode.java
index 715eca315ca..a4fce25e356 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/AndroidManifestsGroupNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidManifestsGroupNode.java
@@ -87,6 +87,18 @@ public class AndroidManifestsGroupNode extends ProjectViewNode<AndroidFacet> imp
@Nullable
@Override
+ public Comparable getSortKey() {
+ return AndroidSourceType.MANIFEST;
+ }
+
+ @Nullable
+ @Override
+ public Comparable getTypeSortKey() {
+ return AndroidSourceType.MANIFEST;
+ }
+
+ @Nullable
+ @Override
public String toTestString(@Nullable Queryable.PrintInfo printInfo) {
return MANIFESTS_NODE;
}
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidModuleNode.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidModuleNode.java
index 39d265d97af..326541e034e 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/AndroidModuleNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidModuleNode.java
@@ -21,7 +21,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.intellij.codeInsight.dataflow.SetUtil;
import com.intellij.ide.projectView.ViewSettings;
-import com.intellij.ide.projectView.impl.nodes.PackageViewModuleNode;
+import com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
@@ -42,7 +42,7 @@ import java.util.Set;
* roots contain Java packages. This class overrides that behavior to provide a per source type node ({@link AndroidSourceTypeNode}) inside
* a module.
*/
-public class AndroidModuleNode extends PackageViewModuleNode {
+public class AndroidModuleNode extends ProjectViewModuleNode {
private final AndroidProjectViewPane myProjectViewPane;
public AndroidModuleNode(@NotNull Project project,
@@ -134,6 +134,18 @@ public class AndroidModuleNode extends PackageViewModuleNode {
@Nullable
@Override
+ public Comparable getSortKey() {
+ return getValue().getName();
+ }
+
+ @Nullable
+ @Override
+ public Comparable getTypeSortKey() {
+ return getSortKey();
+ }
+
+ @Nullable
+ @Override
public String toTestString(@Nullable Queryable.PrintInfo printInfo) {
Module module = getValue();
return String.format("%1$s (Android)", module.getName());
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidPsiDirectoryNode.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidPsiDirectoryNode.java
index 7fa37834f92..a768e5942e0 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/AndroidPsiDirectoryNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidPsiDirectoryNode.java
@@ -48,6 +48,18 @@ public class AndroidPsiDirectoryNode extends PsiDirectoryNode {
}
}
+ @Override
+ public Comparable getSortKey() {
+ String sourceProviderName = mySourceProvider == null ? "" : mySourceProvider.getName();
+ return getQualifiedNameSortKey() + "-" + (SdkConstants.FD_MAIN.equals(sourceProviderName) ? "" : sourceProviderName);
+ }
+
+ @Nullable
+ @Override
+ public Comparable getTypeSortKey() {
+ return getSortKey();
+ }
+
@Nullable
@Override
public String toTestString(@Nullable Queryable.PrintInfo printInfo) {
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidResComparator.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidResComparator.java
new file mode 100644
index 00000000000..4b606d3d114
--- /dev/null
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidResComparator.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2014 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.tools.idea.navigator.nodes;
+
+import com.android.ide.common.resources.configuration.FolderConfiguration;
+import com.intellij.ide.util.treeView.NodeDescriptor;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.PsiFile;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Comparator;
+
+/**
+ * A comparator for {@link com.android.tools.idea.navigator.nodes.AndroidResFileNode} and
+ * {@link com.android.tools.idea.navigator.nodes.AndroidResGroupNode} objects, used to sort nodes of these two types which could
+ * be present as siblings in the Android Project Pane.
+ */
+public class AndroidResComparator implements Comparator {
+ public static final AndroidResComparator INSTANCE = new AndroidResComparator();
+
+ @Override
+ public int compare(Object o1, Object o2) {
+ if (!(o1 instanceof NodeDescriptor) || !(o2 instanceof NodeDescriptor)) {
+ return 0;
+ }
+
+ // we only support comparing res file nodes and res group nodes
+ if (!(o1 instanceof AndroidResFileNode) && !(o1 instanceof AndroidResGroupNode)) {
+ return 0;
+ }
+ if (!(o2 instanceof AndroidResFileNode) && !(o2 instanceof AndroidResGroupNode)) {
+ return 0;
+ }
+
+ // if one of them is a group node, then we just have to compare them alphabetically
+ if (o1 instanceof AndroidResGroupNode || o2 instanceof AndroidResGroupNode) {
+ String n1 = getName(o1);
+ String n2 = getName(o2);
+ return StringUtil.compare(n1, n2, false);
+ }
+
+ AndroidResFileNode r1 = (AndroidResFileNode)o1;
+ AndroidResFileNode r2 = (AndroidResFileNode)o2;
+
+ // first check file names
+ PsiFile file1 = r1.getValue();
+ PsiFile file2 = r2.getValue();
+ if (file1 != null && file2 != null) {
+ int c = StringUtil.compare(file1.getName(), file2.getName(), false);
+ if (c != 0) {
+ return c;
+ }
+ }
+
+ // check folder configurations
+ FolderConfiguration config1 = r1.getFolderConfiguration();
+ FolderConfiguration config2 = r2.getFolderConfiguration();
+ if (config1 != null && config2 != null) {
+ int c = config1.compareTo(config2);
+ if (c != 0) {
+ return c;
+ }
+ }
+
+ // then check qualifiers
+ return StringUtil.compare(r1.getQualifier(), r2.getQualifier(), false);
+ }
+
+ @Nullable
+ private static String getName(Object o1) {
+ if (o1 instanceof AndroidResGroupNode) {
+ return ((AndroidResGroupNode)o1).getResName();
+ } else if (o1 instanceof AndroidResFileNode) {
+ return ((AndroidResFileNode)o1).getResName();
+ } else {
+ return null;
+ }
+ }
+}
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidResFileNode.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidResFileNode.java
index bd47d7327c9..7f84893ed06 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/AndroidResFileNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidResFileNode.java
@@ -16,6 +16,7 @@
package com.android.tools.idea.navigator.nodes;
import com.android.SdkConstants;
+import com.android.ide.common.resources.configuration.FolderConfiguration;
import com.android.resources.ResourceConstants;
import com.android.tools.idea.navigator.AndroidProjectViewPane;
import com.google.common.base.Joiner;
@@ -24,17 +25,19 @@ import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.projectView.impl.nodes.PsiFileNode;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Queryable;
+import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.ui.SimpleTextAttributes;
+import com.siyeh.ig.internationalization.CharacterComparisonInspection;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.facet.IdeaSourceProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.List;
+import java.util.Comparator;
-public class AndroidResFileNode extends PsiFileNode {
+public class AndroidResFileNode extends PsiFileNode implements Comparable {
private final AndroidFacet myFacet;
public AndroidResFileNode(@NotNull Project project,
@@ -53,7 +56,7 @@ public class AndroidResFileNode extends PsiFileNode {
data.addText(text, SimpleTextAttributes.REGULAR_ATTRIBUTES);
data.setPresentableText(text);
- String qualifier = getQualifier(getValue());
+ String qualifier = getQualifier();
if (qualifier != null) {
data.addText(qualifier, SimpleTextAttributes.GRAY_ATTRIBUTES);
}
@@ -63,12 +66,13 @@ public class AndroidResFileNode extends PsiFileNode {
@Override
public String toTestString(@Nullable Queryable.PrintInfo printInfo) {
PsiFile psiFile = getValue();
- String qualifier = getQualifier(psiFile);
+ String qualifier = getQualifier();
return psiFile.getName() + (qualifier == null ? "" : qualifier);
}
@Nullable
- private String getQualifier(@Nullable PsiFile resFile) {
+ String getQualifier() {
+ PsiFile resFile = getValue();
if (resFile == null) { // happens if psiFile becomes invalid
return null;
}
@@ -106,6 +110,39 @@ public class AndroidResFileNode extends PsiFileNode {
}
@Nullable
+ public FolderConfiguration getFolderConfiguration() {
+ PsiFile psiFile = getValue();
+ if (psiFile == null) { // happens if psiFile becomes invalid
+ return null;
+ }
+
+ PsiDirectory folder = psiFile.getParent();
+ return folder == null ? null : FolderConfiguration.getConfigForFolder(folder.getName());
+ }
+
+ @Nullable
+ @Override
+ public Comparable getSortKey() {
+ return this;
+ }
+
+ @Override
+ public Comparable getTypeSortKey() {
+ return this;
+ }
+
+ @Override
+ public int compareTo(@NotNull Object obj) {
+ return AndroidResComparator.INSTANCE.compare(this, obj);
+ }
+
+ @Nullable
+ public String getResName() {
+ PsiFile f = getValue();
+ return (f == null || !f.isValid()) ? null : f.getName();
+ }
+
+ @Nullable
private IdeaSourceProvider findSourceProviderForResFolder(@NotNull PsiDirectory resDirectory) {
for (IdeaSourceProvider provider : AndroidProjectViewPane.getSourceProviders(myFacet)) {
if (provider.getResDirectories().contains(resDirectory.getVirtualFile())) {
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidResFolderTypeNode.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidResFolderTypeNode.java
index 37f912b93f9..3a34d283b03 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/AndroidResFolderTypeNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidResFolderTypeNode.java
@@ -110,6 +110,18 @@ public class AndroidResFolderTypeNode extends ProjectViewNode<List<PsiDirectory>
@Nullable
@Override
+ public Comparable getSortKey() {
+ return myFolderType;
+ }
+
+ @Nullable
+ @Override
+ public Comparable getTypeSortKey() {
+ return myFolderType;
+ }
+
+ @Nullable
+ @Override
public String toTestString(@Nullable Queryable.PrintInfo printInfo) {
return myFolderType.getName();
}
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidResGroupNode.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidResGroupNode.java
index 8a29bd616a3..8462e75d86e 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/AndroidResGroupNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidResGroupNode.java
@@ -36,7 +36,7 @@ import java.util.Collection;
import java.util.List;
/** {@link AndroidResGroupNode} groups together all the configuration specific alternatives of a single resource. */
-public class AndroidResGroupNode extends ProjectViewNode<List<PsiFile>> implements DirectoryGroupNode {
+public class AndroidResGroupNode extends ProjectViewNode<List<PsiFile>> implements DirectoryGroupNode, Comparable {
@NotNull private final String myResName;
@NotNull private final AndroidFacet myFacet;
@NotNull private final List<PsiFile> myFiles;
@@ -85,6 +85,33 @@ public class AndroidResGroupNode extends ProjectViewNode<List<PsiFile>> implemen
}
@Override
+ public int getWeight() {
+ return 20; // same as PsiFileNode so that res group nodes are compared with resources only alphabetically
+ }
+
+ @Nullable
+ @Override
+ public Comparable getSortKey() {
+ return this;
+ }
+
+ @Nullable
+ @Override
+ public Comparable getTypeSortKey() {
+ return this;
+ }
+
+ @Override
+ public int compareTo(@NotNull Object obj) {
+ return AndroidResComparator.INSTANCE.compare(this, obj);
+ }
+
+ @NotNull
+ public String getResName() {
+ return myResName;
+ }
+
+ @Override
protected void update(PresentationData presentation) {
presentation.setPresentableText(myResName);
presentation.addText(myResName, SimpleTextAttributes.REGULAR_ATTRIBUTES);
diff --git a/android/src/com/android/tools/idea/navigator/nodes/AndroidSourceTypeNode.java b/android/src/com/android/tools/idea/navigator/nodes/AndroidSourceTypeNode.java
index 1c2219c8d04..7accab3855b 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/AndroidSourceTypeNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/AndroidSourceTypeNode.java
@@ -162,6 +162,12 @@ public class AndroidSourceTypeNode extends ProjectViewNode<AndroidFacet> impleme
return mySourceType;
}
+ @Nullable
+ @Override
+ public Comparable getTypeSortKey() {
+ return mySourceType;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
diff --git a/android/src/com/android/tools/idea/navigator/nodes/NonAndroidModuleNode.java b/android/src/com/android/tools/idea/navigator/nodes/NonAndroidModuleNode.java
index 25c192ee9f2..0a9d9507bfb 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/NonAndroidModuleNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/NonAndroidModuleNode.java
@@ -72,6 +72,18 @@ public class NonAndroidModuleNode extends ProjectViewModuleNode {
@Nullable
@Override
+ public Comparable getSortKey() {
+ return getValue().getName();
+ }
+
+ @Nullable
+ @Override
+ public Comparable getTypeSortKey() {
+ return getSortKey();
+ }
+
+ @Nullable
+ @Override
public String toTestString(@Nullable Queryable.PrintInfo printInfo) {
return String.format("%1$s (non-Android)", getValue().getName());
}
diff --git a/android/src/com/android/tools/idea/navigator/nodes/NonAndroidSourceTypeNode.java b/android/src/com/android/tools/idea/navigator/nodes/NonAndroidSourceTypeNode.java
index 820bfc72aad..d41f4ebc00e 100644
--- a/android/src/com/android/tools/idea/navigator/nodes/NonAndroidSourceTypeNode.java
+++ b/android/src/com/android/tools/idea/navigator/nodes/NonAndroidSourceTypeNode.java
@@ -106,6 +106,18 @@ public class NonAndroidSourceTypeNode extends ProjectViewNode<Module> implements
@Nullable
@Override
+ public Comparable getSortKey() {
+ return mySourceType;
+ }
+
+ @Nullable
+ @Override
+ public Comparable getTypeSortKey() {
+ return mySourceType;
+ }
+
+ @Nullable
+ @Override
public String toTestString(@Nullable Queryable.PrintInfo printInfo) {
return mySourceType.presentableName;
}
diff --git a/android/testData/projects/navigator/packageview/simple/app/src/main/res/drawable-mdpi/j.png b/android/testData/projects/navigator/packageview/simple/app/src/main/res/drawable-mdpi/j.png
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/android/testData/projects/navigator/packageview/simple/app/src/main/res/drawable-mdpi/j.png
diff --git a/android/testSrc/com/android/tools/idea/navigator/AndroidProjectViewTest.java b/android/testSrc/com/android/tools/idea/navigator/AndroidProjectViewTest.java
index 4e6069e9b11..ca4c805d413 100644
--- a/android/testSrc/com/android/tools/idea/navigator/AndroidProjectViewTest.java
+++ b/android/testSrc/com/android/tools/idea/navigator/AndroidProjectViewTest.java
@@ -19,6 +19,7 @@ import com.android.tools.idea.gradle.util.GradleUtil;
import com.android.tools.idea.navigator.nodes.AndroidViewProjectNode;
import com.android.tools.idea.templates.AndroidGradleTestCase;
import com.intellij.ide.projectView.ViewSettings;
+import com.intellij.ide.projectView.impl.GroupByTypeComparator;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.module.Module;
@@ -58,32 +59,22 @@ public class AndroidProjectViewTest extends AndroidGradleTestCase {
String projectName = getProject().getName();
String expected =
projectName + "\n" +
- " Gradle Scripts\n" +
- " build.gradle (app)\n" +
- " build.gradle (javamodule)\n" +
- " build.gradle (lib)\n" +
- " build.gradle (" + rootModuleName + ")\n" +
- " gradle-wrapper.properties\n" +
- " local.properties\n" +
- " settings.gradle (Project Settings)\n" +
- " sonar.gradle (app)\n" +
" app (Android)\n" +
- " assets\n" +
- " raw.asset.txt\n" +
+ " manifests\n" +
+ " AndroidManifest.xml (main)\n" +
+ " AndroidManifest.xml (debug)\n" +
" java\n" +
- " Debug.java\n" +
- " app (androidTest)\n" +
- " MainActivityTest.java\n" +
" app (main)\n" +
" MainActivity\n" +
- " manifests\n" +
- " AndroidManifest.xml (debug)\n" +
- " AndroidManifest.xml (main)\n" +
+ " app (androidTest)\n" +
+ " MainActivityTest.java\n" +
+ " Debug.java\n" +
" res\n" +
" drawable\n" +
" ic_launcher.png (2)\n" +
" ic_launcher.png (hdpi, debug)\n" +
" ic_launcher.png (mdpi)\n" +
+ " j.png (mdpi)\n" +
" layout\n" +
" activity_main.xml\n" +
" menu\n" +
@@ -97,34 +88,45 @@ public class AndroidProjectViewTest extends AndroidGradleTestCase {
" strings.xml\n" +
" strings.xml (debug)\n" +
" styles.xml\n" +
+ " assets\n" +
+ " raw.asset.txt\n" +
" rs\n" +
" test.rs\n" +
" javamodule (non-Android)\n" +
" java\n" +
" foo\n" +
" Foo.java\n" +
+ " tests\n" +
+ " foo\n" +
+ " FooTest.java\n" +
" resources\n" +
" res2.txt\n" +
" test-resources\n" +
" test-res.txt\n" +
- " tests\n" +
- " foo\n" +
- " FooTest.java\n" +
" lib (Android)\n" +
- " jni\n" +
- " hello.c\n" +
- " jniLibs\n" +
- " libc.so\n" +
" manifests\n" +
" AndroidManifest.xml (main)\n" +
" res\n" +
" drawable\n" +
" ic_launcher.png (mdpi)\n" +
" values\n" +
- " strings.xml\n";
+ " strings.xml\n" +
+ " jni\n" +
+ " hello.c\n" +
+ " jniLibs\n" +
+ " libc.so\n" +
+ " Gradle Scripts\n" +
+ " gradle-wrapper.properties\n" +
+ " local.properties\n" +
+ " settings.gradle (Project Settings)\n" +
+ " build.gradle (app)\n" +
+ " sonar.gradle (app)\n" +
+ " build.gradle (javamodule)\n" +
+ " build.gradle (lib)\n" +
+ " build.gradle (" + rootModuleName + ")\n";
int numLines = expected.split("\n").length;
ProjectViewTestUtil
- .assertStructureEqual(structure, expected, numLines, PlatformTestUtil.createComparator(printInfo), structure.getRootElement(),
+ .assertStructureEqual(structure, expected, numLines, new GroupByTypeComparator(null, "android"), structure.getRootElement(),
printInfo);
}