From 8004eec011525f37dad63c2fa2e00662c25010fe Mon Sep 17 00:00:00 2001 From: SyntaxSpin <86142168+SyntaxSpin@users.noreply.github.com> Date: Thu, 19 Feb 2026 11:14:21 +0100 Subject: [PATCH 01/12] Feat : added new filetree --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 4 + .../fragments/BaseFragment.java | 6 +- .../fragments/MainFragment.java | 123 ++++++++++- app/src/main/res/drawable/git_24px.xml | 14 ++ .../ic_folder_rounded_filled_24dp.xml | 10 + .../ic_menu_open_rounded_filled_24dp.xml | 11 + app/src/main/res/layout/fragment_main.xml | 115 +++++++++- app/src/main/res/menu/sheet_options_menu.xml | 14 ++ build.gradle.kts | 1 + filetree/.gitignore | 1 + filetree/build.gradle | 43 ++++ filetree/proguard-rules.pro | 21 ++ filetree/src/main/AndroidManifest.xml | 1 + .../kotlin/com/zyron/filetree/FileTree.kt | 199 +++++++++++++++++ .../zyron/filetree/adapter/FileTreeAdapter.kt | 206 ++++++++++++++++++ .../filetree/callback/FileTreeDiffCallback.kt | 43 ++++ .../zyron/filetree/datamodel/FileTreeNode.kt | 61 ++++++ .../filetree/events/FileTreeEventListener.kt | 58 +++++ .../zyron/filetree/map/ConcurrentFileMap.kt | 119 ++++++++++ .../com/zyron/filetree/map/FileMapManager.kt | 59 +++++ .../provider/DefaultFileIconProvider.kt | 100 +++++++++ .../filetree/provider/FileIconProvider.kt | 69 ++++++ .../kotlin/com/zyron/filetree/utils/Utils.kt | 31 +++ .../filetree/viewholder/FileTreeViewHolder.kt | 41 ++++ .../com/zyron/filetree/widget/FileTreeView.kt | 165 ++++++++++++++ filetree/src/main/res/anim/default_anim.xml | 5 + .../src/main/res/anim/default_animation.xml | 5 + filetree/src/main/res/anim/fall_down.xml | 16 ++ .../src/main/res/anim/fall_down_animation.xml | 5 + filetree/src/main/res/anim/rotate_in.xml | 14 ++ .../src/main/res/anim/rotate_in_animation.xml | 5 + filetree/src/main/res/anim/scale_up.xml | 16 ++ .../src/main/res/anim/scale_up_animation.xml | 5 + filetree/src/main/res/anim/slide_in.xml | 12 + .../src/main/res/anim/slide_in_animation.xml | 5 + filetree/src/main/res/drawable/ic_chevron.xml | 11 + filetree/src/main/res/drawable/ic_file.xml | 11 + filetree/src/main/res/drawable/ic_folder.xml | 10 + .../drawable/item_activated_background.xml | 24 ++ .../res/drawable/item_selected_background.xml | 24 ++ .../res/drawable/item_view_background.xml | 30 +++ .../main/res/layout/filetree_view_item.xml | 51 +++++ filetree/src/main/res/values/attrs.xml | 33 +++ gradle/libs.versions.toml | 3 + settings.gradle.kts | 1 + 46 files changed, 1796 insertions(+), 6 deletions(-) create mode 100755 app/src/main/res/drawable/git_24px.xml create mode 100644 app/src/main/res/drawable/ic_folder_rounded_filled_24dp.xml create mode 100644 app/src/main/res/drawable/ic_menu_open_rounded_filled_24dp.xml create mode 100644 app/src/main/res/menu/sheet_options_menu.xml create mode 100755 filetree/.gitignore create mode 100755 filetree/build.gradle create mode 100755 filetree/proguard-rules.pro create mode 100755 filetree/src/main/AndroidManifest.xml create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/FileTree.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/adapter/FileTreeAdapter.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/callback/FileTreeDiffCallback.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/datamodel/FileTreeNode.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/events/FileTreeEventListener.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/map/ConcurrentFileMap.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/map/FileMapManager.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/provider/DefaultFileIconProvider.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/provider/FileIconProvider.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/utils/Utils.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/viewholder/FileTreeViewHolder.kt create mode 100755 filetree/src/main/kotlin/com/zyron/filetree/widget/FileTreeView.kt create mode 100755 filetree/src/main/res/anim/default_anim.xml create mode 100755 filetree/src/main/res/anim/default_animation.xml create mode 100755 filetree/src/main/res/anim/fall_down.xml create mode 100755 filetree/src/main/res/anim/fall_down_animation.xml create mode 100755 filetree/src/main/res/anim/rotate_in.xml create mode 100755 filetree/src/main/res/anim/rotate_in_animation.xml create mode 100755 filetree/src/main/res/anim/scale_up.xml create mode 100755 filetree/src/main/res/anim/scale_up_animation.xml create mode 100755 filetree/src/main/res/anim/slide_in.xml create mode 100755 filetree/src/main/res/anim/slide_in_animation.xml create mode 100755 filetree/src/main/res/drawable/ic_chevron.xml create mode 100755 filetree/src/main/res/drawable/ic_file.xml create mode 100755 filetree/src/main/res/drawable/ic_folder.xml create mode 100755 filetree/src/main/res/drawable/item_activated_background.xml create mode 100755 filetree/src/main/res/drawable/item_selected_background.xml create mode 100755 filetree/src/main/res/drawable/item_view_background.xml create mode 100755 filetree/src/main/res/layout/filetree_view_item.xml create mode 100755 filetree/src/main/res/values/attrs.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b1b2363..497df57 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -66,6 +66,7 @@ dependencies { implementation(libs.transition) implementation(libs.fragment) implementation(libs.activity) + implementation(project(":filetree")) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9cc8bfe..002c7f0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,10 @@ + + + + folderPickerLauncher = + registerForActivityResult( + new ActivityResultContracts.OpenDocumentTree(), + treeUri -> { + if (treeUri == null) return; + + int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION | + Intent.FLAG_GRANT_WRITE_URI_PERMISSION; + + requireContext().getContentResolver() + .takePersistableUriPermission(treeUri, flags); + + path = getRealPathFromUri(treeUri); + setupFileTree(); + Toast.makeText(requireContext(), "Folder selected!", Toast.LENGTH_LONG).show(); + + } + ); + private String getRealPathFromUri(Uri treeUri) { + String docId = DocumentsContract.getTreeDocumentId(treeUri); + String[] split = docId.split(":"); + String type = split[0]; + String relativePath = split.length > 1 ? split[1] : ""; + if ("primary".equalsIgnoreCase(type)) { + return Environment.getExternalStorageDirectory() + "/" + relativePath; + } else { + String externalStorage = System.getenv("SECONDARY_STORAGE"); + if (externalStorage == null) { + externalStorage = System.getenv("EXTERNAL_STORAGE"); + } + return externalStorage + "/" + relativePath; + } + } private FragmentMainBinding binding; + private FileTreeIconProvider fileIconProvider; + private String path =""; + + private static final int REQUEST_CODE_OPEN_DIRECTORY = 1001; public static final String[] SYMBOLS = { "TAB","↵", "{", "}", "(", ")", @@ -39,6 +94,11 @@ public class MainFragment extends BaseFragment { ">", "[", "]", ":" }; + public interface FileTreeEventListener { + void onFileClick(File file); + void onFolderClick(File folder); + } + @Override public View onCreateView( @NonNull LayoutInflater inflater, ViewGroup container, @@ -52,14 +112,50 @@ public View onCreateView( public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + + //AppStruct setupToolbar(); setupToolbox(); setupInputView(); setupTabLayoutTemp(); slideXDrawer(); + drawerLeftContent(); binding.fab.setTranslationY(-12); + } + private void drawerLeftContent() { + + binding.fileTree.setVisibility(View.VISIBLE); + binding.contentGit.setVisibility(View.GONE); + binding.btmOptions.setOnNavigationItemSelectedListener( + item -> { + var sharedAxis = new MaterialSharedAxis(MaterialSharedAxis.X, true); + TransitionManager.beginDelayedTransition(binding.container, sharedAxis); + if (item.getItemId() == R.id.option_file_tree) { + binding.contentGit.setVisibility(View.GONE); + binding.fileTree.setVisibility(View.VISIBLE); + } else if (item.getItemId() == R.id.option_git) { + binding.contentGit.setVisibility(View.VISIBLE); + binding.fileTree.setVisibility(View.GONE); + } + return true; + } + ); + setupFileTree(); + } + private void setupFileTree() { + if (path != null && !path.isEmpty()) { + binding.contentFileTree.setVisibility(View.VISIBLE); + binding.requireFolder.setVisibility(View.GONE); + binding.fileTreeView.initializeFileTree(path, this , fileIconProvider); + }else{ + binding.contentFileTree.setVisibility(View.GONE); + binding.requireFolder.setVisibility(View.VISIBLE); + binding.openFolder.setOnClickListener(v -> { + folderPickerLauncher.launch(null); + }); + } } private void slideXDrawer() { @@ -189,6 +285,27 @@ public void onDestroyView() { binding = null; } + public void onFileClick(File file) { + } + + + public void onFolderClick(File folder) {} + + + public boolean onFileLongClick(File file) { + return true; + } + + + public boolean onFolderLongClick(File folder) { + + return true; + } + + + public void onFileTreeViewUpdated(int startPosition, int itemCount) {} + + diff --git a/app/src/main/res/drawable/git_24px.xml b/app/src/main/res/drawable/git_24px.xml new file mode 100755 index 0000000..c7f0c5a --- /dev/null +++ b/app/src/main/res/drawable/git_24px.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_folder_rounded_filled_24dp.xml b/app/src/main/res/drawable/ic_folder_rounded_filled_24dp.xml new file mode 100644 index 0000000..5923958 --- /dev/null +++ b/app/src/main/res/drawable/ic_folder_rounded_filled_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_menu_open_rounded_filled_24dp.xml b/app/src/main/res/drawable/ic_menu_open_rounded_filled_24dp.xml new file mode 100644 index 0000000..b861603 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_open_rounded_filled_24dp.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index aa44cb8..2b1af4d 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -133,14 +133,125 @@ app:srcCompat="@drawable/ic_play_arrow_rounded_filled_24dp" /> - + android:id="@+id/left_drawer_menu"> + + + + + +