Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion jadx-gui/src/main/java/jadx/gui/treemodel/JResource.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
Expand Down Expand Up @@ -69,7 +70,7 @@ public enum JResType {
}

private final transient String name;
private final transient String shortName;
private transient String shortName;
private final transient JResType type;
private final transient ResourceFile resFile;

Expand Down Expand Up @@ -159,6 +160,50 @@ private static void sortResNodes(List<JResource> nodes) {
}
}

/**
* Collapse single-child DIR chains into one node with a slash-joined display name (GitHub-style).
*/
public static void mergeMiddleDirs(JResource root) {
mergeChildren(root.subNodes);
}

public static void mergeMiddleDirs(List<JResource> roots) {
mergeChildren(roots);
}

private static void mergeChildren(List<JResource> children) {
for (int i = 0; i < children.size(); i++) {
JResource sub = children.get(i);
JResource replaced = mergeChain(sub, new ArrayList<>());
if (replaced != sub) {
children.set(i, replaced);
}
mergeChildren(replaced.subNodes);
}
}

private static JResource mergeChain(JResource node, List<JResource> merged) {
if (node.type == JResType.DIR) {
List<JResource> subs = node.subNodes;
if (subs.size() == 1 && subs.get(0).type == JResType.DIR) {
merged.add(node);
return mergeChain(subs.get(0), merged);
}
}
if (!merged.isEmpty()) {
merged.add(node);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < merged.size(); i++) {
if (i > 0) {
sb.append('/');
}
sb.append(merged.get(i).shortName);
}
node.shortName = sb.toString();
}
return node;
}

@Override
public boolean hasContent() {
return resFile != null;
Expand Down
1 change: 1 addition & 0 deletions jadx-gui/src/main/java/jadx/gui/treemodel/JRoot.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ private JResource getHierarchyResources(List<ResourceFile> resources) {
JResource leaf = new JResource(rf, rf.getDeobfName(), parts[count - 1], JResType.FILE);
curRf.addSubNode(leaf);
}
JResource.mergeMiddleDirs(root);
root.sortSubNodes();
root.update();
return root;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public class ResTableHelper {
public static List<JResource> buildTree(JResource resTableRes, ResContainer resTable) {
ResTableHelper resTableHelper = new ResTableHelper(resTableRes);
resTableHelper.process(resTable);
JResource.mergeMiddleDirs(resTableHelper.roots);
return resTableHelper.roots;
}

Expand Down
Loading