mirror of
https://gitee.com/zhangsken/AndroidIDE.git
synced 2026-10-16 07:49:44 +08:00
Fixed #340: Chevron icon not updated when directory is expanded or collapsed
This commit is contained in:
+1
-1
@@ -57,7 +57,7 @@ public class FileTreeViewHolder extends TreeNode.BaseNodeViewHolder<File> {
|
||||
: (int)
|
||||
(TypedValue.applyDimension(
|
||||
TypedValue.COMPLEX_UNIT_DIP, 15, context.getResources().getDisplayMetrics()));
|
||||
int icon = 0;
|
||||
int icon;
|
||||
if (file.isDirectory()) icon = R.drawable.ic_folder;
|
||||
else if (file.getName().endsWith(".java")) icon = R.drawable.ic_language_java;
|
||||
else if (file.getName().endsWith(".kt")) icon = R.drawable.ic_language_kotlin;
|
||||
|
||||
@@ -30,7 +30,6 @@ import androidx.annotation.NonNull;
|
||||
import androidx.transition.ChangeBounds;
|
||||
import androidx.transition.TransitionManager;
|
||||
|
||||
import com.blankj.utilcode.util.FileIOUtils;
|
||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
|
||||
import com.itsaky.androidide.R;
|
||||
import com.itsaky.androidide.adapters.viewholders.FileTreeViewHolder;
|
||||
@@ -42,7 +41,6 @@ import com.itsaky.androidide.events.ListProjectFilesRequestEvent;
|
||||
import com.itsaky.androidide.projects.ProjectManager;
|
||||
import com.itsaky.androidide.tasks.TaskExecutor;
|
||||
import com.itsaky.androidide.tasks.callables.FileTreeCallable;
|
||||
import com.itsaky.androidide.utils.Environment;
|
||||
import com.itsaky.androidide.utils.ILogger;
|
||||
import com.unnamed.b.atv.model.TreeNode;
|
||||
import com.unnamed.b.atv.view.AndroidTreeView;
|
||||
@@ -121,29 +119,23 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
|
||||
@Override
|
||||
public void onClick(TreeNode node, Object p2) {
|
||||
final File f = (File) p2;
|
||||
if (!f.exists()) {
|
||||
final File file = (File) p2;
|
||||
if (!file.exists()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (f.isDirectory()) {
|
||||
if (file.isDirectory()) {
|
||||
if (node.isExpanded()) {
|
||||
collapseNode(node);
|
||||
} else if (f.getAbsolutePath().equals(Environment.GRADLE_USER_HOME.getAbsolutePath())
|
||||
&& !node.isExpanded()) {
|
||||
expandNode(node);
|
||||
} else {
|
||||
setLoading(node);
|
||||
listNode(
|
||||
node,
|
||||
() -> {
|
||||
updateChevron(node);
|
||||
expandNode(node);
|
||||
});
|
||||
() -> expandNode(node));
|
||||
}
|
||||
}
|
||||
|
||||
final var event = new FileClickEvent(f);
|
||||
final var event = new FileClickEvent(file);
|
||||
event.put(Context.class, requireContext());
|
||||
EventBus.getDefault().post(event);
|
||||
}
|
||||
@@ -168,7 +160,7 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onGetListFilesRequeste(ListProjectFilesRequestEvent event) {
|
||||
public void onGetListFilesRequested(ListProjectFilesRequestEvent event) {
|
||||
if (!isVisible() || getContext() == null) {
|
||||
return;
|
||||
}
|
||||
@@ -179,10 +171,12 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
@SuppressWarnings("unused")
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onGetExpandTreeNodeRequest(ExpandTreeNodeRequestEvent event) {
|
||||
if (!isVisible() || getContext() == null || event.getNode() == null) {
|
||||
if (!isVisible() || getContext() == null) {
|
||||
return;
|
||||
} else {
|
||||
event.getNode();
|
||||
}
|
||||
|
||||
|
||||
expandNode(event.getNode());
|
||||
}
|
||||
|
||||
@@ -193,6 +187,7 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
|
||||
TransitionManager.beginDelayedTransition(binding.getRoot(), new ChangeBounds());
|
||||
mFileTreeView.collapseNode(node);
|
||||
updateChevron(node);
|
||||
}
|
||||
|
||||
public void expandNode(TreeNode node) {
|
||||
@@ -202,6 +197,7 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
|
||||
TransitionManager.beginDelayedTransition(binding.getRoot(), new ChangeBounds());
|
||||
mFileTreeView.expandNode(node);
|
||||
updateChevron(node);
|
||||
}
|
||||
|
||||
public void listProjectFiles() {
|
||||
@@ -210,25 +206,8 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
return;
|
||||
}
|
||||
final var projectDirPath = ProjectManager.INSTANCE.getProjectDirPath();
|
||||
final File gradleProps = Environment.GRADLE_PROPS;
|
||||
final File gradleHome = Environment.GRADLE_USER_HOME;
|
||||
File projectDir = new File(projectDirPath);
|
||||
final var projectDir = new File(projectDirPath);
|
||||
mRoot = TreeNode.root(projectDir);
|
||||
if (gradleHome.exists() && gradleHome.isDirectory()) {
|
||||
if (!gradleProps.exists()) {
|
||||
FileIOUtils.writeFileFromString(
|
||||
gradleProps,
|
||||
"# Specify global Gradle properties in this file\n"
|
||||
+ "# These properties will be applicable for every project you build"
|
||||
+ " with Gradle.");
|
||||
}
|
||||
TreeNode home = new TreeNode(gradleHome);
|
||||
home.setViewHolder(new FileTreeViewHolder(getContext()));
|
||||
TreeNode prop = new TreeNode(gradleProps);
|
||||
prop.setViewHolder(new FileTreeViewHolder(getContext()));
|
||||
home.addChild(prop);
|
||||
mRoot.addChild(home);
|
||||
}
|
||||
mRoot.setViewHolder(new FileTreeViewHolder(getContext()));
|
||||
|
||||
binding.filetreeHorizontalScrollView.setVisibility(View.GONE);
|
||||
@@ -287,14 +266,14 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
final var finalWhenDone = whenDone;
|
||||
TaskExecutor.execAsync(
|
||||
() -> {
|
||||
getNodeFromFiles(node.getValue().listFiles(), node);
|
||||
listFilesForNode(node.getValue().listFiles(), node);
|
||||
TreeNode temp = node;
|
||||
while (temp.size() == 1) {
|
||||
temp = temp.childAt(0);
|
||||
if (!temp.getValue().isDirectory()) {
|
||||
break;
|
||||
}
|
||||
getNodeFromFiles(temp.getValue().listFiles(), temp);
|
||||
listFilesForNode(temp.getValue().listFiles(), temp);
|
||||
temp.setExpanded(true);
|
||||
}
|
||||
return null;
|
||||
@@ -302,7 +281,7 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
__ -> finalWhenDone.run());
|
||||
}
|
||||
|
||||
private void getNodeFromFiles(File[] files, TreeNode parent) {
|
||||
private void listFilesForNode(File[] files, TreeNode parent) {
|
||||
Arrays.sort(files, new FileTreeCallable.SortFileName());
|
||||
Arrays.sort(files, new FileTreeCallable.SortFolder());
|
||||
for (File file : files) {
|
||||
@@ -314,7 +293,7 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
|
||||
private void updateChevron(@NonNull TreeNode node) {
|
||||
if (node.getViewHolder() instanceof FileTreeViewHolder) {
|
||||
((FileTreeViewHolder) node.getViewHolder()).updateChevron(!node.isExpanded());
|
||||
((FileTreeViewHolder) node.getViewHolder()).updateChevron(node.isExpanded());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -324,15 +303,10 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
|
||||
private void tryRestoreState(String state) {
|
||||
if (!TextUtils.isEmpty(state) && mFileTreeView != null) {
|
||||
|
||||
LOG.debug("Restoring tree view state:", "'" + state + "'");
|
||||
|
||||
mFileTreeView.collapseAll();
|
||||
final var openNodesArray = state.split(NODES_PATH_SEPARATOR);
|
||||
final var openNodes = new HashSet<>(Arrays.asList(openNodesArray));
|
||||
restoreNodeState(mRoot, openNodes);
|
||||
} else {
|
||||
LOG.error("Unable to restore tree state", "treeState=" + state, "treeView=" + mFileTreeView);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -344,7 +318,6 @@ public class FileTreeFragment extends BottomSheetDialogFragment
|
||||
listNode(
|
||||
node,
|
||||
() -> {
|
||||
updateChevron(node);
|
||||
expandNode(node);
|
||||
restoreNodeState(node, openNodes);
|
||||
});
|
||||
|
||||
@@ -33,8 +33,8 @@ import java.util.concurrent.Callable;
|
||||
|
||||
public class FileTreeCallable implements Callable<Boolean> {
|
||||
private final Context ctx;
|
||||
private TreeNode parent;
|
||||
private File file;
|
||||
private final TreeNode parent;
|
||||
private final File file;
|
||||
|
||||
public FileTreeCallable(Context ctx, TreeNode parent, File file) {
|
||||
this.ctx = ctx;
|
||||
|
||||
@@ -66,7 +66,6 @@ public final class Environment {
|
||||
|
||||
public static File INIT_SCRIPT;
|
||||
public static File PROJECT_DATA_FILE;
|
||||
public static File GRADLE_PROPS;
|
||||
public static File GRADLE_USER_HOME;
|
||||
public static File AAPT2;
|
||||
public static File JAVA;
|
||||
@@ -97,7 +96,6 @@ public final class Environment {
|
||||
INIT_SCRIPT = new File(mkdirIfNotExits(new File(ANDROIDIDE_HOME, "init")), "init.gradle");
|
||||
BOOTCLASSPATH = new File("");
|
||||
GRADLE_USER_HOME = new File(HOME, ".gradle");
|
||||
GRADLE_PROPS = new File(GRADLE_USER_HOME, "gradle.properties");
|
||||
|
||||
IDE_PROPS.putAll(readProperties());
|
||||
ANDROID_HOME = new File(readProp("ANDROID_HOME", DEFAULT_ANDROID_HOME));
|
||||
|
||||
Binary file not shown.
@@ -24,4 +24,6 @@ android {
|
||||
dependencies {
|
||||
implementation fileTree (dir: 'libs', include: ['*.jar'])
|
||||
implementation androidx.appcompat
|
||||
|
||||
implementation project (path: ':logger')
|
||||
}
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package com.unnamed.b.atv.model;
|
||||
|
||||
import static com.itsaky.androidide.utils.ILogger.newInstance;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.itsaky.androidide.utils.ILogger;
|
||||
import com.unnamed.b.atv.R;
|
||||
import com.unnamed.b.atv.view.AndroidTreeView;
|
||||
import com.unnamed.b.atv.view.TreeNodeWrapperView;
|
||||
@@ -19,6 +22,7 @@ import java.util.List;
|
||||
public class TreeNode {
|
||||
|
||||
public static final String NODES_ID_SEPARATOR = ":";
|
||||
private static final ILogger LOG = newInstance("TreeNode");
|
||||
private final List<TreeNode> children;
|
||||
private int mId;
|
||||
private int mLastId;
|
||||
@@ -121,6 +125,7 @@ public class TreeNode {
|
||||
}
|
||||
|
||||
public TreeNode setExpanded(boolean expanded) {
|
||||
LOG.debug("TreeNode expanded state changed. New state:", expanded, new RuntimeException());
|
||||
mExpanded = expanded;
|
||||
return this;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user