├── .gitignore ├── .metadata ├── .vscode ├── c_cpp_properties.json ├── launch.json ├── notes.txt └── settings.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── .project ├── .settings │ └── org.eclipse.buildship.core.prefs ├── app │ ├── .classpath │ ├── .project │ ├── .settings │ │ └── org.eclipse.buildship.core.prefs │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── assets │ │ │ ├── arm64-v8a │ │ │ │ ├── busybox │ │ │ │ └── proot │ │ │ └── x86_64 │ │ │ │ ├── busybox │ │ │ │ └── proot │ │ ├── java │ │ │ └── com │ │ │ │ └── deskbtm │ │ │ │ └── aqua │ │ │ │ ├── InnerPluginMgmt.java │ │ │ │ ├── MainActivity.java │ │ │ │ ├── Template.java │ │ │ │ └── tools │ │ │ │ ├── archive │ │ │ │ ├── Archive.java │ │ │ │ ├── ArchiveMapper.java │ │ │ │ └── ArchivePlugin.java │ │ │ │ ├── connectivity │ │ │ │ ├── Connectivity.java │ │ │ │ ├── ConnectivityBroadcastReceiver.java │ │ │ │ ├── ConnectivityMethodChannelHandler.java │ │ │ │ └── ConnectivityPlugin.java │ │ │ │ ├── fs │ │ │ │ ├── ExtendStorage.java │ │ │ │ ├── FsPlugin.java │ │ │ │ ├── PathProvider.java │ │ │ │ ├── SAFStorage.java │ │ │ │ ├── StorageDescription.java │ │ │ │ ├── StorageDirectoryMapper.java │ │ │ │ └── StorageListenerPlugin.java │ │ │ │ ├── glide │ │ │ │ ├── BitmapTarget.java │ │ │ │ ├── EnumMapper.java │ │ │ │ ├── GlideHandler.java │ │ │ │ ├── GlidePlugin.java │ │ │ │ └── Reply.java │ │ │ │ ├── pkg │ │ │ │ ├── PackageManagerPlugin.java │ │ │ │ └── PackageMgmt.java │ │ │ │ └── virtual_container │ │ │ │ ├── VirtualContainerPlugin.java │ │ │ │ └── VirtualContainerUtils.java │ │ └── res │ │ │ ├── drawable-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── drawable │ │ │ ├── ic_baseline_folder_24.xml │ │ │ └── launch_background.xml │ │ │ ├── layout │ │ │ └── demo.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── values │ │ │ ├── setings.xml │ │ │ └── styles.xml │ │ │ └── xml │ │ │ └── network_security_config.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── debug.properties ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── logo.svg ├── settings.gradle └── settings_aar.gradle ├── aqua_policy.html ├── assets ├── images │ ├── ai.png │ ├── alipay.jpg │ ├── apk.png │ ├── audio.png │ ├── csv.png │ ├── excel.png │ ├── exe.png │ ├── flash.png │ ├── folder.png │ ├── html.png │ ├── image.png │ ├── link.png │ ├── logo.png │ ├── md.png │ ├── pdf.png │ ├── ppt.png │ ├── psd.png │ ├── txt.png │ ├── unknown.png │ ├── video.png │ ├── wechat_pay.jpg │ ├── word.png │ ├── xml.png │ └── zip.png ├── logo.svg └── web │ ├── plyr.css │ └── plyr.js ├── build.bat ├── image ├── QQE59BBEE7898720210105161527-281004-o_1er8v8kudfdb1i715l3eoi1bf215-uid-1111781@1080x1920.jpg ├── QQE59BBEE7898720210105161531-281004-o_1er8v8kudojamqs1v7p1t5g139716-uid-1111781@1080x1920.jpg ├── QQE59BBEE7898720210105161535-281004-o_1er8v8kudv6ivnd1svrshk19rk17-uid-1111781@1080x1920.jpg ├── QQE59BBEE7898720210105161539-281004-o_1er8v8kud1uei1lpo1bqf16n3inq18-uid-1111781@1080x1920.jpg └── QQE59BBEE7898720210105161737-281057-o_1erc01i4hccv1ifs1ok711utgbi2h-uid-1111781@1080x1920.jpg ├── ios ├── .gitignore ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-1024x1024@1x.png │ │ ├── Icon-App-20x20@1x.png │ │ ├── Icon-App-20x20@2x.png │ │ ├── Icon-App-20x20@3x.png │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ └── LaunchImage.imageset │ │ ├── Contents.json │ │ ├── LaunchImage.png │ │ ├── LaunchImage@2x.png │ │ ├── LaunchImage@3x.png │ │ └── README.md │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h ├── l10n.yaml ├── lib ├── aqua.dart ├── common │ ├── theme.dart │ └── widget │ │ ├── action_button.dart │ │ ├── aqua_text_field.dart │ │ ├── checkbox.dart │ │ ├── cloud_header.dart │ │ ├── dialog.dart │ │ ├── double_pop.dart │ │ ├── fade_in.dart │ │ ├── function_widget.dart │ │ ├── icon_item.dart │ │ ├── images.dart │ │ ├── inner_drawer.dart │ │ ├── input.dart │ │ ├── loading_flipping.dart │ │ ├── marquee.dart │ │ ├── modal │ │ ├── show_modal.dart │ │ ├── show_specific_modal.dart │ │ └── split_modal.dart │ │ ├── no_resize_text.dart │ │ ├── overwrite_cupertino_modal.dart │ │ ├── point_tab.dart │ │ ├── progress.dart │ │ ├── refresh_header.dart │ │ ├── static_utils.dart │ │ ├── storage_card.dart │ │ ├── switch.dart │ │ ├── tile.dart │ │ └── widget.dart ├── constant │ ├── constant.dart │ └── constant_var.dart ├── external │ ├── breadcrumb │ │ ├── flutter_breadcrumb.dart │ │ └── src │ │ │ ├── breadcrumb.dart │ │ │ ├── breadcrumb_item.dart │ │ │ ├── breadcrumb_overflow.dart │ │ │ └── breadcrumb_widget.dart │ ├── menu │ │ └── menu.dart │ ├── switch │ │ ├── animation_switch.dart │ │ ├── thumb_painter.dart │ │ └── xliv-switch.dart │ └── webdav │ │ ├── src │ │ ├── client.dart │ │ ├── file.dart │ │ └── retry.dart │ │ └── webdav.dart ├── l10n │ ├── app_en.arb │ └── app_zh.arb ├── main.dart ├── model │ ├── associate_view_model.dart │ ├── file_manager_model.dart │ ├── global_model.dart │ ├── independent_view_model.dart │ ├── model.dart │ ├── quick_board_model.dart │ ├── select_file_model.dart │ └── theme_model.dart ├── page │ ├── file_editor │ │ ├── dialog.dart │ │ ├── editor_theme.dart │ │ ├── encoding_list.dart │ │ ├── file_editor.dart │ │ ├── langagues.dart │ │ ├── loading.dart │ │ ├── modal.dart │ │ └── tool_item.dart │ ├── file_manager │ │ ├── archive_modal.dart │ │ ├── associate_view.dart │ │ ├── create_file_modal.dart │ │ ├── file_info_card.dart │ │ ├── file_list.dart │ │ ├── file_list_tile.dart │ │ ├── file_manager.dart │ │ ├── file_operation.dart │ │ ├── fs_ui_utils.dart │ │ ├── fs_utils.dart │ │ ├── independent_view.dart │ │ ├── left_sider.dart │ │ ├── nav_bar.dart │ │ ├── path_breadcrumb.dart │ │ ├── rename_modal.dart │ │ ├── search_bar.dart │ │ └── show_more.dart │ ├── home │ │ ├── home.dart │ │ ├── left_quick_board.dart │ │ └── right_quick_board.dart │ ├── installed_apps │ │ └── installed_apps.dart │ ├── lan │ │ ├── code_server │ │ │ └── utils.dart │ │ ├── create_proot_env.dart │ │ ├── share.dart │ │ └── static_fs │ │ │ ├── body_parser │ │ │ ├── shelf_body_parser.dart │ │ │ └── src │ │ │ │ ├── body_parse_result.dart │ │ │ │ ├── body_parser.dart │ │ │ │ ├── buffer.dart │ │ │ │ ├── file.dart │ │ │ │ └── shelf_body_parser.dart │ │ │ ├── directory_listing.dart │ │ │ ├── util.dart │ │ │ └── web_handler.dart │ ├── not_support │ │ └── not_support.dart │ ├── photo_viewer │ │ └── photo_viewer.dart │ ├── purchase │ │ └── purchase.dart │ ├── setting │ │ ├── about.dart │ │ ├── code_setting.dart │ │ ├── helper_setting.dart │ │ ├── privacy_policy.dart │ │ ├── setting.dart │ │ └── widget │ │ │ └── setting_item.dart │ └── video │ │ ├── meida_info.dart │ │ └── video.dart ├── plugin │ ├── archive │ │ ├── archive.dart │ │ └── enums.dart │ ├── glide │ │ ├── enum.dart │ │ └── glide.dart │ ├── pkg_mgmt │ │ └── mgmt.dart │ └── storage │ │ ├── enums.dart │ │ ├── listener.dart │ │ └── storage.dart ├── third_party │ ├── back_button_interceptor │ │ ├── back_button_interceptor.dart │ │ └── src │ │ │ ├── back_button_interceptor.dart │ │ │ └── merge_sort.dart │ ├── connectivity │ │ ├── connectivity.dart │ │ ├── connectivity_platform_interface.dart │ │ ├── enums.dart │ │ ├── method_channel_connectivity.dart │ │ └── utils.dart │ └── photo_view │ │ ├── photo_view.dart │ │ ├── photo_view_gallery.dart │ │ └── src │ │ ├── controller │ │ ├── photo_view_controller.dart │ │ ├── photo_view_controller_delegate.dart │ │ └── photo_view_scalestate_controller.dart │ │ ├── core │ │ ├── photo_view_core.dart │ │ ├── photo_view_gesture_detector.dart │ │ └── photo_view_hit_corners.dart │ │ ├── photo_view_computed_scale.dart │ │ ├── photo_view_default_widgets.dart │ │ ├── photo_view_scale_state.dart │ │ ├── photo_view_wrappers.dart │ │ └── utils │ │ ├── ignorable_change_notifier.dart │ │ ├── photo_view_hero_attributes.dart │ │ └── photo_view_utils.dart └── utils │ ├── dio_range.dart │ ├── mix_utils.dart │ ├── notification.dart │ ├── req.dart │ ├── store.dart │ └── webdav.dart ├── plugins ├── android_intent │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── analysis_options.yaml │ ├── android │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── settings.gradle │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── com │ │ │ └── deskbtm │ │ │ └── aqua │ │ │ └── android_intent │ │ │ └── AndroidIntentPlugin.java │ ├── lib │ │ └── android_intent.dart │ ├── pubspec.lock │ └── pubspec.yaml ├── android_saf │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── android │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── settings.gradle │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── com │ │ │ └── deskbtm │ │ │ └── android_saf │ │ │ └── AndroidSafPlugin.java │ ├── lib │ │ └── android_saf.dart │ ├── pubspec.lock │ └── pubspec.yaml ├── intent │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── android │ │ ├── .classpath │ │ ├── .gitignore │ │ ├── .project │ │ ├── .settings │ │ │ └── org.eclipse.buildship.core.prefs │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── settings.gradle │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin │ │ │ └── io │ │ │ │ └── github │ │ │ │ └── itzmeanjan │ │ │ │ └── intent │ │ │ │ ├── IntentPlugin.kt │ │ │ │ └── MyProvider.kt │ │ │ └── res │ │ │ └── xml │ │ │ └── file_paths.xml │ ├── ios │ │ ├── .gitignore │ │ ├── Assets │ │ │ └── .gitkeep │ │ ├── Classes │ │ │ ├── IntentPlugin.h │ │ │ └── IntentPlugin.m │ │ └── intent.podspec │ ├── lib │ │ ├── action.dart │ │ ├── category.dart │ │ ├── extra.dart │ │ ├── flag.dart │ │ ├── intent.dart │ │ └── typedExtra.dart │ └── pubspec.yaml ├── markdown_weight │ ├── .github │ │ ├── ISSUE_TEMPLATE │ │ │ ├── bug_report.md │ │ │ └── feature_request.md │ │ └── workflows │ │ │ └── build_web.yml │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── README.md │ ├── README_ZH.md │ ├── lib │ │ ├── config │ │ │ ├── highlight_themes.dart │ │ │ ├── html_support.dart │ │ │ ├── style_config.dart │ │ │ └── widget_config.dart │ │ ├── markdown_generator.dart │ │ ├── markdown_helper.dart │ │ ├── markdown_themes │ │ │ ├── all_themes.dart │ │ │ ├── dark_theme.dart │ │ │ └── light_theme.dart │ │ ├── markdown_toc.dart │ │ ├── markdown_widget.dart │ │ └── tags │ │ │ ├── a.dart │ │ │ ├── all_tags.dart │ │ │ ├── blockquote.dart │ │ │ ├── code.dart │ │ │ ├── hr.dart │ │ │ ├── img.dart │ │ │ ├── input.dart │ │ │ ├── markdown_tags.dart │ │ │ ├── ol.dart │ │ │ ├── other.dart │ │ │ ├── p.dart │ │ │ ├── pre.dart │ │ │ ├── table.dart │ │ │ ├── title.dart │ │ │ ├── ul.dart │ │ │ └── video.dart │ └── pubspec.yaml ├── pure_video_player │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── android │ │ ├── .classpath │ │ ├── .gitignore │ │ ├── .project │ │ ├── .settings │ │ │ └── org.eclipse.buildship.core.prefs │ │ ├── build.gradle │ │ ├── gradle.properties │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── settings.gradle │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── com │ │ │ └── sewerganger │ │ │ └── pure_video_player │ │ │ └── PureVideoPlayerPlugin.java │ ├── assets │ │ └── icons │ │ │ ├── fast-forward.png │ │ │ ├── fullscreen.png │ │ │ ├── minimize.png │ │ │ ├── mute.png │ │ │ ├── pause.png │ │ │ ├── picture-in-picture.png │ │ │ ├── play.png │ │ │ ├── repeat.png │ │ │ ├── rewind.png │ │ │ └── sound.png │ ├── ios │ │ ├── .gitignore │ │ ├── Assets │ │ │ └── .gitkeep │ │ ├── Classes │ │ │ ├── PureVideoPlayerPlugin.h │ │ │ ├── PureVideoPlayerPlugin.m │ │ │ └── SwiftPureVideoPlayerPlugin.swift │ │ └── pure_video_player.podspec │ ├── lib │ │ ├── pure_video_player.dart │ │ └── src │ │ │ ├── controller.dart │ │ │ ├── helpers │ │ │ ├── custom_icons.dart │ │ │ ├── data_source.dart │ │ │ ├── enabled_buttons.dart │ │ │ ├── player_data_status.dart │ │ │ ├── pure_player_status.dart │ │ │ ├── responsive.dart │ │ │ ├── screen_manager.dart │ │ │ └── utils.dart │ │ │ ├── native │ │ │ └── pip_manager.dart │ │ │ └── widgets │ │ │ ├── closed_caption_view.dart │ │ │ ├── fullscreen_button.dart │ │ │ ├── fullscreen_page.dart │ │ │ ├── mute_sound_button.dart │ │ │ ├── pip_button.dart │ │ │ ├── play_pause_button.dart │ │ │ ├── player_button.dart │ │ │ ├── player_slider.dart │ │ │ ├── pure_video_player.dart │ │ │ └── styles │ │ │ ├── controls_container.dart │ │ │ ├── primary │ │ │ ├── bottom_controls.dart │ │ │ └── primary_player_controls.dart │ │ │ └── secondary │ │ │ ├── secondary_bottom_controls.dart │ │ │ └── secondary_player_controls.dart │ ├── pubspec.lock │ └── pubspec.yaml └── storage_mount_listener │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── android │ ├── .classpath │ ├── .gitignore │ ├── .project │ ├── .settings │ │ └── org.eclipse.buildship.core.prefs │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ ├── settings.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── sewerganger │ │ └── storage_mount_listener │ │ └── StorageMountListenerPlugin.java │ ├── ios │ ├── .gitignore │ ├── Assets │ │ └── .gitkeep │ ├── Classes │ │ ├── StorageMountListenerPlugin.h │ │ └── StorageMountListenerPlugin.m │ └── storage_mount_listener.podspec │ ├── lib │ └── storage_mount_listener.dart │ ├── pubspec.lock │ └── pubspec.yaml ├── pubspec.lock ├── pubspec.yaml └── windows ├── .gitignore ├── CMakeLists.txt └── runner ├── CMakeLists.txt ├── Runner.rc ├── flutter_window.cpp ├── flutter_window.h ├── main.cpp ├── resource.h ├── resources └── app_icon.ico ├── runner.exe.manifest ├── utils.cpp ├── utils.h ├── win32_window.cpp └── win32_window.h /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | temp 12 | *.jks 13 | 14 | # IntelliJ related 15 | *.iml 16 | *.ipr 17 | *.iws 18 | .idea/ 19 | android/r.jks 20 | android/key.properties 21 | 22 | 23 | # The .vscode folder contains launch configuration and tasks you configure in 24 | # VS Code which you may wish to be included in version control, so this line 25 | # is commented out by default. 26 | #.vscode/ 27 | 28 | # Flutter/Dart/Pub related 29 | **/doc/api/ 30 | .dart_tool/ 31 | .flutter-plugins 32 | .flutter-plugins-dependencies 33 | .packages 34 | .pub-cache/ 35 | .pub/ 36 | **/build/ 37 | **/example 38 | **/.gradle 39 | 40 | # Web related 41 | lib/generated_plugin_registrant.dart 42 | 43 | # Symbolication related 44 | app.*.symbols 45 | 46 | # Obfuscation related 47 | app.*.map.json 48 | 49 | # Exceptions to above rules. 50 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 51 | test 52 | 53 | mirrors/ 54 | .unotes 55 | flutter -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 8af6b2f038c1172e61d418869363a28dffec3cb4 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Win32", 5 | "includePath": [ 6 | "${workspaceFolder}/**", 7 | "${vcpkgRoot}/x86-windows/include" 8 | ], 9 | "defines": [ 10 | "_DEBUG", 11 | "UNICODE", 12 | "_UNICODE" 13 | ], 14 | "windowsSdkVersion": "10.0.19041.0", 15 | "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.28.29333/bin/Hostx64/x64/cl.exe", 16 | "cStandard": "c17", 17 | "cppStandard": "c++17", 18 | "intelliSenseMode": "windows-msvc-x64" 19 | } 20 | ], 21 | "version": 4 22 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Flutter Profile", 9 | "type": "dart", 10 | "request": "launch", 11 | "program": "lib/main.dart", 12 | "flutterMode": "profile" 13 | }, 14 | { 15 | "name": "Flutter", 16 | "program": "lib/main.dart", 17 | "request": "launch", 18 | "type": "dart" 19 | } 20 | ] 21 | } -------------------------------------------------------------------------------- /.vscode/notes.txt: -------------------------------------------------------------------------------- 1 | ListView.builder( 2 | controller: _scrollController, 3 | physics: BouncingScrollPhysics(), 4 | itemCount: widget.fileList.length, 5 | itemBuilder: (BuildContext context, int index) { 6 | SelfFileEntity file = widget.fileList[index]; 7 | ListFileItemInfo item = ListFileItemInfo( 8 | leading: getPreviewIcon(context, _tm, file), 9 | file: file, 10 | ); 11 | 12 | return FileItem( 13 | mode: widget.mode, 14 | isDir: item.file.isDir, 15 | leading: item.leading, 16 | withAnimation: index < 15, 17 | index: index, 18 | file: item.file, 19 | onLongPress: (details) { 20 | if (widget.itemOnLongPress != null) { 21 | widget.itemOnLongPress(index); 22 | } 23 | }, 24 | onTap: () { 25 | if (widget.onItemTap != null) widget.onItemTap(index); 26 | }, 27 | onItemHozDrag: (dir) async { 28 | /// [index] 位数 [dir] 方向 1 向右 -1 左 29 | await widget.onItemHozDrag(index, dir); 30 | }, 31 | ); 32 | }, 33 | ), -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[markdown]": { 3 | "editor.quickSuggestions": { 4 | "other": true, // this must be true 5 | "comments": false, 6 | "strings": false 7 | } 8 | }, 9 | "cSpell.ignoreWords": [ 10 | "sdk", 11 | "umeng", 12 | "umeng sdk" 13 | ], 14 | "copyrightInserter.holder": "deskbtm", 15 | "copyrightInserter.license": "gpl3" 16 | } -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [v1.0.5] - 2021-05-30 4 | 5 | ### Added 6 | 7 | - 添加首次使用向导 8 | - 添加到系统打开方式 9 | 10 | ### Changed 11 | - 支持上下分屏 支持窗口独立模式 12 | - 使用新UI 包含(搜索,总体布局) 13 | - 优化文件名过长问题 14 | - 优化目录滚拖拽组件 15 | - 翻译部分英文 16 | - 使用原生 toast 17 | - 启用新的管理后台 18 | - 更换 icon 19 | - 迁移空安全 20 | - 迁移原生插件到android目录 21 | - 重新实现virtual container, 升级code server 22 | 23 | ### Fixed 24 | 25 | - 优化代码丢失导致的性能问题,修复 bug 26 | - 重构大量代码 27 | 28 | ### Removed 29 | 30 | - 彻底删除乱起八糟毛用没有的功能 31 | ## [v1.0.4] - 2021-01-30 32 | 33 | ### Added 34 | 35 | - 增添国际化 支持英语(未完全覆盖) 36 | - 添加到系统打开方式 37 | 38 | ### Changed 39 | - 移除内购 40 | - 改名为 Aqua 41 | ## [v1.0.3] - 2020-12-15 42 | 43 | ### Added 44 | 45 | - 增添国际化 支持英语(未完全覆盖) 46 | - 添加到系统打开方式 47 | 48 | ### Fixed 49 | - 修复服务器到期, 50 | - 修复 iqoo 等机型文件管理器无法使用 51 | - 由于代码丢失,不保证所有功能正常 52 | - 改名为 Aqua 53 | ## [v1.0.0] - 2020-11-12 54 | 55 | ### Added 56 | 57 | - 添加下拉刷新 58 | - 添加当前目录搜索 59 | 60 | ### Fixed 61 | - 修复服务器到期, 62 | - 修复 iqoo 等机型文件管理器无法使用 63 | - 由于代码丢失,不保证所有功能正常 64 | ## [v0.0.2] - 2020-10-12 65 | ### Fixed 66 | - 修复在根目录下新建文件夹失败 67 | - 添加二维码扫描 打开链接 68 | - 优化视频和图片缩略图 69 | - 优化 APP 体积 70 | - 优化视频播放器,支持小窗模式 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## WIP 2 | 3 | 下载 4 | 5 | 欢迎 star fork 6 | 7 | v1.0.5 [refactor](./CHANGELOG.md) 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | Credits 23 | 24 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | linter: 13 | # The lint rules applied to this project can be customized in the 14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 15 | # included above or to enable additional rules. A list of all available lints 16 | # and their documentation is published at 17 | # https://dart-lang.github.io/linter/lints/index.html. 18 | # 19 | # Instead of disabling a lint rule for the entire project in the 20 | # section below, it can also be suppressed for a single line of code 21 | # or a specific dart file by using the `// ignore: name_of_lint` and 22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 23 | # producing the lint. 24 | rules: 25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 27 | 28 | # Additional information about this file can be found at 29 | # https://dart.dev/guides/language/analysis-options 30 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | -------------------------------------------------------------------------------- /android/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | android 4 | Project android created by Buildship. 5 | 6 | 7 | 8 | 9 | org.eclipse.buildship.core.gradleprojectbuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.buildship.core.gradleprojectnature 16 | 17 | 18 | 19 | 1627469160247 20 | 21 | 30 22 | 23 | org.eclipse.core.resources.regexFilterMatcher 24 | node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /android/.settings/org.eclipse.buildship.core.prefs: -------------------------------------------------------------------------------- 1 | arguments= 2 | auto.sync=false 3 | build.scans.enabled=false 4 | connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) 5 | connection.project.dir= 6 | eclipse.preferences.version=1 7 | gradle.user.home= 8 | java.home=C\:/Program Files/Java/jdk1.8.0_202 9 | jvm.arguments= 10 | offline.mode=false 11 | override.workspace.settings=true 12 | show.console.view=true 13 | show.executions.view=true 14 | -------------------------------------------------------------------------------- /android/app/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /android/app/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | app 4 | Project app created by Buildship. 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.eclipse.buildship.core.gradleprojectbuilder 15 | 16 | 17 | 18 | 19 | 20 | org.eclipse.jdt.core.javanature 21 | org.eclipse.buildship.core.gradleprojectnature 22 | 23 | 24 | 25 | 1627469160268 26 | 27 | 30 28 | 29 | org.eclipse.core.resources.regexFilterMatcher 30 | node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /android/app/.settings/org.eclipse.buildship.core.prefs: -------------------------------------------------------------------------------- 1 | connection.project.dir=.. 2 | eclipse.preferences.version=1 3 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | #Flutter Wrapper 2 | -keep class io.flutter.app.** { *; } 3 | -keep class io.flutter.plugin.** { *; } 4 | -keep class io.flutter.util.** { *; } 5 | -keep class io.flutter.view.** { *; } 6 | -keep class io.flutter.** { *; } 7 | -keep class io.flutter.plugins.** { *; } 8 | 9 | 10 | #友盟 11 | -keep class com.umeng.** {*;} 12 | -keep class com.uc.** {*;} 13 | -keepclassmembers class * { 14 | public (org.json.JSONObject); 15 | } 16 | -keepclassmembers enum * { 17 | public static **[] values(); 18 | public static ** valueOf(java.lang.String); 19 | } 20 | -keep class com.zui.** {*;} 21 | -keep class com.miui.** {*;} 22 | -keep class com.heytap.** {*;} 23 | -keep class a.** {*;} 24 | -keep class com.vivo.** {*;} 25 | 26 | # 压缩 27 | -keep class net.lingala.** {*;} 28 | -keep class org.apache.** {*;} 29 | -keep class org.rauschig.** {*;} 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/assets/arm64-v8a/busybox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deskbtm/Aqua/f7da42246b088161c3f20143b6acdace1e930b6e/android/app/src/main/assets/arm64-v8a/busybox -------------------------------------------------------------------------------- /android/app/src/main/assets/arm64-v8a/proot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deskbtm/Aqua/f7da42246b088161c3f20143b6acdace1e930b6e/android/app/src/main/assets/arm64-v8a/proot -------------------------------------------------------------------------------- /android/app/src/main/assets/x86_64/busybox: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deskbtm/Aqua/f7da42246b088161c3f20143b6acdace1e930b6e/android/app/src/main/assets/x86_64/busybox -------------------------------------------------------------------------------- /android/app/src/main/assets/x86_64/proot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/deskbtm/Aqua/f7da42246b088161c3f20143b6acdace1e930b6e/android/app/src/main/assets/x86_64/proot -------------------------------------------------------------------------------- /android/app/src/main/java/com/deskbtm/aqua/InnerPluginMgmt.java: -------------------------------------------------------------------------------- 1 | package com.deskbtm.aqua; 2 | 3 | import com.deskbtm.aqua.tools.archive.ArchivePlugin; 4 | import com.deskbtm.aqua.tools.connectivity.ConnectivityPlugin; 5 | import com.deskbtm.aqua.tools.fs.FsPlugin; 6 | import com.deskbtm.aqua.tools.fs.StorageListenerPlugin; 7 | import com.deskbtm.aqua.tools.glide.GlidePlugin; 8 | import com.deskbtm.aqua.tools.pkg.PackageManagerPlugin; 9 | 10 | import io.flutter.embedding.engine.FlutterEngine; 11 | 12 | public final class InnerPluginMgmt { 13 | public static void register(FlutterEngine flutterEngine) { 14 | flutterEngine.getPlugins().add(new ConnectivityPlugin()); 15 | flutterEngine.getPlugins().add(new GlidePlugin()); 16 | flutterEngine.getPlugins().add(new ArchivePlugin()); 17 | flutterEngine.getPlugins().add(new PackageManagerPlugin()); 18 | // 基本文件系统操作插件 19 | flutterEngine.getPlugins().add(new FsPlugin()); 20 | // 存储设备监听插件 21 | flutterEngine.getPlugins().add(new StorageListenerPlugin()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/deskbtm/aqua/tools/connectivity/ConnectivityBroadcastReceiver.java: -------------------------------------------------------------------------------- 1 | // Copyright 2019 The Chromium Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | package com.deskbtm.aqua.tools.connectivity; 6 | 7 | import android.content.BroadcastReceiver; 8 | import android.content.Context; 9 | import android.content.Intent; 10 | import android.content.IntentFilter; 11 | import android.net.ConnectivityManager; 12 | import io.flutter.plugin.common.EventChannel; 13 | 14 | /** 15 | * The ConnectivityBroadcastReceiver receives the connectivity updates and send them to the UIThread 16 | * through an {@link EventChannel.EventSink} 17 | * 18 | *

Use {@link 19 | * io.flutter.plugin.common.EventChannel#setStreamHandler(io.flutter.plugin.common.EventChannel.StreamHandler)} 20 | * to set up the receiver. 21 | */ 22 | class ConnectivityBroadcastReceiver extends BroadcastReceiver 23 | implements EventChannel.StreamHandler { 24 | private Context context; 25 | private Connectivity connectivity; 26 | private EventChannel.EventSink events; 27 | 28 | ConnectivityBroadcastReceiver(Context context, Connectivity connectivity) { 29 | this.context = context; 30 | this.connectivity = connectivity; 31 | } 32 | 33 | @Override 34 | public void onListen(Object arguments, EventChannel.EventSink events) { 35 | this.events = events; 36 | context.registerReceiver(this, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 37 | } 38 | 39 | @Override 40 | public void onCancel(Object arguments) { 41 | context.unregisterReceiver(this); 42 | } 43 | 44 | @Override 45 | public void onReceive(Context context, Intent intent) { 46 | if (events != null) { 47 | events.success(connectivity.getNetworkType()); 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/deskbtm/aqua/tools/connectivity/ConnectivityMethodChannelHandler.java: -------------------------------------------------------------------------------- 1 | // Copyright 2019 The Chromium Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | 5 | package com.deskbtm.aqua.tools.connectivity; 6 | 7 | import io.flutter.plugin.common.MethodCall; 8 | import io.flutter.plugin.common.MethodChannel; 9 | 10 | /** 11 | * The handler receives {@link MethodCall}s from the UIThread, gets the related information from 12 | * a @{@link Connectivity}, and then send the result back to the UIThread through the {@link 13 | * MethodChannel.Result}. 14 | */ 15 | class ConnectivityMethodChannelHandler implements MethodChannel.MethodCallHandler { 16 | 17 | private Connectivity connectivity; 18 | 19 | /** 20 | * Construct the ConnectivityMethodChannelHandler with a {@code connectivity}. The {@code 21 | * connectivity} must not be null. 22 | */ 23 | ConnectivityMethodChannelHandler(Connectivity connectivity) { 24 | assert (connectivity != null); 25 | this.connectivity = connectivity; 26 | } 27 | 28 | @Override 29 | public void onMethodCall(MethodCall call, MethodChannel.Result result) { 30 | switch (call.method) { 31 | case "check": 32 | result.success(connectivity.getNetworkType()); 33 | break; 34 | case "wifiName": 35 | result.success(connectivity.getWifiName()); 36 | break; 37 | case "wifiBSSID": 38 | result.success(connectivity.getWifiBSSID()); 39 | break; 40 | case "wifiIPAddress": 41 | result.success(connectivity.getWifiIPAddress()); 42 | break; 43 | default: 44 | result.notImplemented(); 45 | break; 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/deskbtm/aqua/tools/fs/SAFStorage.java: -------------------------------------------------------------------------------- 1 | package com.deskbtm.aqua.tools.fs; 2 | 3 | import android.content.Context; 4 | 5 | public class SAFStorage { 6 | private Context mContext; 7 | 8 | public SAFStorage(Context context){ 9 | mContext = context; 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/deskbtm/aqua/tools/fs/StorageDescription.java: -------------------------------------------------------------------------------- 1 | package com.deskbtm.aqua.tools.fs; 2 | 3 | import java.io.File; 4 | 5 | import android.content.Context; 6 | 7 | import androidx.annotation.IntDef; 8 | 9 | public final class StorageDescription { 10 | 11 | public static final int STORAGE_INTERNAL = 0; 12 | public static final int STORAGE_SD_CARD = 1; 13 | public static final int ROOT = 2; 14 | public static final int NOT_KNOWN = 3; 15 | 16 | @IntDef({STORAGE_INTERNAL, STORAGE_SD_CARD, ROOT, NOT_KNOWN}) 17 | public @interface DeviceDescription { 18 | } 19 | 20 | public static @DeviceDescription 21 | int getDeviceDescriptionLegacy(File file) { 22 | String path = file.getPath(); 23 | 24 | switch (path) { 25 | case "/storage/emulated/legacy": 26 | case "/storage/emulated/0": 27 | case "/mnt/sdcard": 28 | return STORAGE_INTERNAL; 29 | case "/storage/sdcard": 30 | case "/storage/sdcard1": 31 | return STORAGE_SD_CARD; 32 | case "/": 33 | return ROOT; 34 | default: 35 | return NOT_KNOWN; 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/deskbtm/aqua/tools/fs/StorageDirectoryMapper.java: -------------------------------------------------------------------------------- 1 | package com.deskbtm.aqua.tools.fs; 2 | 3 | import android.os.Build; 4 | import android.os.Environment; 5 | 6 | class StorageDirectoryMapper { 7 | 8 | static String androidType(Integer dartIndex) throws IllegalArgumentException { 9 | if (dartIndex == null) { 10 | return null; 11 | } 12 | 13 | switch (dartIndex) { 14 | case 0: 15 | return Environment.DIRECTORY_MUSIC; 16 | case 1: 17 | return Environment.DIRECTORY_PODCASTS; 18 | case 2: 19 | return Environment.DIRECTORY_RINGTONES; 20 | case 3: 21 | return Environment.DIRECTORY_ALARMS; 22 | case 4: 23 | return Environment.DIRECTORY_NOTIFICATIONS; 24 | case 5: 25 | return Environment.DIRECTORY_PICTURES; 26 | case 6: 27 | return Environment.DIRECTORY_MOVIES; 28 | case 7: 29 | return Environment.DIRECTORY_DOWNLOADS; 30 | case 8: 31 | return Environment.DIRECTORY_DCIM; 32 | case 9: 33 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 34 | return Environment.DIRECTORY_DOCUMENTS; 35 | } else { 36 | throw new IllegalArgumentException("Documents directory is unsupported."); 37 | } 38 | default: 39 | throw new IllegalArgumentException("Unknown index: " + dartIndex); 40 | } 41 | } 42 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/deskbtm/aqua/tools/glide/BitmapTarget.java: -------------------------------------------------------------------------------- 1 | package com.deskbtm.aqua.tools.glide; 2 | 3 | import android.graphics.Bitmap; 4 | import androidx.annotation.NonNull; 5 | import androidx.annotation.Nullable; 6 | import com.bumptech.glide.request.target.CustomTarget; 7 | import com.bumptech.glide.request.transition.Transition; 8 | 9 | abstract class BitmapTarget extends CustomTarget { 10 | private Bitmap bitmap; 11 | 12 | 13 | public BitmapTarget(Integer width, Integer height) { 14 | super(width, height); 15 | } 16 | 17 | public BitmapTarget() { 18 | super(); 19 | } 20 | 21 | @Override 22 | public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { 23 | bitmap = resource; 24 | } 25 | 26 | @Override 27 | public void onDestroy() { 28 | super.onDestroy(); 29 | if (!bitmap.isRecycled()) { 30 | bitmap.recycle(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/deskbtm/aqua/tools/glide/EnumMapper.java: -------------------------------------------------------------------------------- 1 | package com.deskbtm.aqua.tools.glide; 2 | 3 | 4 | import com.bumptech.glide.load.engine.DiskCacheStrategy; 5 | 6 | public class EnumMapper { 7 | static DiskCacheStrategy cacheStrategy(int type) { 8 | DiskCacheStrategy strategy; 9 | switch (type) { 10 | case 0: 11 | strategy = DiskCacheStrategy.ALL; 12 | break; 13 | case 1: 14 | strategy = DiskCacheStrategy.NONE; 15 | break; 16 | case 2: 17 | strategy = DiskCacheStrategy.DATA; 18 | break; 19 | case 3: 20 | strategy = DiskCacheStrategy.RESOURCE; 21 | break; 22 | default: 23 | strategy = DiskCacheStrategy.AUTOMATIC; 24 | } 25 | return strategy; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/deskbtm/aqua/tools/glide/Reply.java: -------------------------------------------------------------------------------- 1 | package com.deskbtm.aqua.tools.glide; 2 | 3 | import android.app.Activity; 4 | import io.flutter.plugin.common.MethodChannel; 5 | 6 | public class Reply { 7 | private boolean isSending = false; 8 | Activity activity; 9 | MethodChannel.Result result; 10 | 11 | public Reply(Activity activity, MethodChannel.Result result) { 12 | this.activity = activity; 13 | this.result = result; 14 | } 15 | 16 | public void send(Object val) { 17 | if (isSending) { 18 | return; 19 | } 20 | isSending = true; 21 | activity.runOnUiThread(() -> { 22 | result.success(val); 23 | }); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/deskbtm/aqua/tools/virtual_container/VirtualContainerPlugin.java: -------------------------------------------------------------------------------- 1 | package com.deskbtm.aqua.tools.virtual_container; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import androidx.annotation.NonNull; 6 | import io.flutter.embedding.engine.plugins.FlutterPlugin; 7 | import io.flutter.embedding.engine.plugins.activity.ActivityAware; 8 | import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; 9 | import io.flutter.plugin.common.MethodCall; 10 | import io.flutter.plugin.common.MethodChannel; 11 | import io.flutter.plugin.common.MethodChannel.MethodCallHandler; 12 | import io.flutter.plugin.common.MethodChannel.Result; 13 | 14 | /** 15 | * GlidePlugin 16 | */ 17 | public class VirtualContainerPlugin implements FlutterPlugin, MethodCallHandler { 18 | 19 | private MethodChannel channel; 20 | private Context context; 21 | private String CHANNEL_NAME = "aqua_virtual_container"; 22 | 23 | @Override 24 | public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { 25 | channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), CHANNEL_NAME); 26 | channel.setMethodCallHandler(this); 27 | context = flutterPluginBinding.getApplicationContext(); 28 | 29 | } 30 | 31 | @Override 32 | public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { 33 | 34 | VirtualContainerUtils vcu = new VirtualContainerUtils(context); 35 | 36 | switch (call.method) { 37 | case "copyDirFromAssets": 38 | vcu.copyDirFromAssets(call, result); 39 | 40 | } 41 | } 42 | 43 | @Override 44 | public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { 45 | channel.setMethodCallHandler(null); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ic_baseline_folder_24.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/layout/demo.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 |