├── .gitattributes ├── .gitignore ├── Changelog ├── LICENSE ├── README.md ├── TODO ├── build.gradle ├── explorer ├── .gitignore ├── File-Explorer │ ├── .gitattributes │ └── .gitignore ├── build.gradle ├── libs │ └── RootTools-4.2.jar ├── proguard-android.txt └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── mustardlabs │ │ └── explorer │ │ ├── BrowserActivity.java │ │ ├── SearchActivity.java │ │ ├── ThemableActivity.java │ │ ├── adapters │ │ ├── BookmarksAdapter.java │ │ ├── BrowserListAdapter.java │ │ ├── BrowserTabsAdapter.java │ │ ├── DrawerListAdapter.java │ │ └── MergeAdapter.java │ │ ├── controller │ │ └── ActionModeController.java │ │ ├── dialogs │ │ ├── CreateFileDialog.java │ │ ├── CreateFolderDialog.java │ │ ├── DeleteFilesDialog.java │ │ ├── DirectoryInfoDialog.java │ │ ├── FileExistsDialog.java │ │ ├── FilePropertiesDialog.java │ │ ├── GroupOwnerDialog.java │ │ ├── RenameDialog.java │ │ ├── UnpackDialog.java │ │ └── ZipFilesDialog.java │ │ ├── fileobserver │ │ ├── FileObserverCache.java │ │ └── MultiFileObserver.java │ │ ├── fragments │ │ ├── BrowserFragment.java │ │ └── UserVisibleHintFragment.java │ │ ├── preview │ │ ├── BitmapLruCache.java │ │ ├── DrawableLruCache.java │ │ ├── IconPreview.java │ │ └── MimeTypes.java │ │ ├── settings │ │ ├── Settings.java │ │ ├── SettingsActivity.java │ │ └── SettingsFragment.java │ │ ├── tasks │ │ ├── DeleteTask.java │ │ ├── ExtractionTask.java │ │ ├── GroupOwnerTask.java │ │ ├── PasteTask.java │ │ ├── PasteTaskExecutor.java │ │ ├── RenameTask.java │ │ └── ZipTask.java │ │ ├── ui │ │ ├── NavigationView.java │ │ └── PageIndicator.java │ │ └── utils │ │ ├── Bookmark.java │ │ ├── BookmarksHelper.java │ │ ├── ClipBoard.java │ │ ├── Permissions.java │ │ ├── RootCommands.java │ │ ├── SimpleUtils.java │ │ ├── SortUtils.java │ │ ├── StatFsCompat.java │ │ └── ZipUtils.java │ └── res │ ├── drawable-hdpi │ ├── actionpaste.png │ ├── drawer_shadow.9.png │ ├── holo_dark_action_copy.png │ ├── holo_dark_action_cut.png │ ├── holo_dark_action_delete.png │ ├── holo_dark_action_edit.png │ ├── holo_dark_action_info.png │ ├── holo_dark_action_remove.png │ ├── holo_dark_action_search.png │ ├── holo_dark_action_share.png │ ├── holo_dark_ic_action_new.png │ ├── holo_dark_ic_action_select_all.png │ ├── holo_dark_ic_bookmark.png │ ├── holo_dark_ic_storage.png │ ├── holo_light_action_copy.png │ ├── holo_light_action_cut.png │ ├── holo_light_action_delete.png │ ├── holo_light_action_edit.png │ ├── holo_light_action_info.png │ ├── holo_light_action_remove.png │ ├── holo_light_action_search.png │ ├── holo_light_action_select_all.png │ ├── holo_light_action_share.png │ ├── holo_light_ic_action_new.png │ ├── holo_light_ic_bookmark.png │ ├── holo_light_ic_storage.png │ ├── ic_launcher.png │ ├── type_apk.png │ ├── type_config.png │ ├── type_folder.png │ ├── type_folder_empty.png │ ├── type_html.png │ ├── type_music.png │ ├── type_note.png │ ├── type_package.png │ ├── type_pdf.png │ ├── type_pic.png │ ├── type_unknown.png │ ├── type_video.png │ └── type_xml.png │ ├── drawable-mdpi │ ├── actionpaste.png │ ├── drawer_shadow.9.png │ ├── holo_dark_action_copy.png │ ├── holo_dark_action_cut.png │ ├── holo_dark_action_delete.png │ ├── holo_dark_action_edit.png │ ├── holo_dark_action_info.png │ ├── holo_dark_action_remove.png │ ├── holo_dark_action_search.png │ ├── holo_dark_action_share.png │ ├── holo_dark_ic_action_select_all.png │ ├── holo_dark_ic_bookmark.png │ ├── holo_dark_ic_storage.png │ ├── holo_light_action_copy.png │ ├── holo_light_action_cut.png │ ├── holo_light_action_delete.png │ ├── holo_light_action_edit.png │ ├── holo_light_action_info.png │ ├── holo_light_action_remove.png │ ├── holo_light_action_search.png │ ├── holo_light_action_select_all.png │ ├── holo_light_action_share.png │ ├── holo_light_ic_action_new.png │ ├── holo_light_ic_bookmark.png │ ├── holo_light_ic_storage.png │ └── ic_launcher.png │ ├── drawable-xhdpi │ ├── actionpaste.png │ ├── drawer_shadow.9.png │ ├── holo_dark_action_copy.png │ ├── holo_dark_action_cut.png │ ├── holo_dark_action_delete.png │ ├── holo_dark_action_edit.png │ ├── holo_dark_action_info.png │ ├── holo_dark_action_remove.png │ ├── holo_dark_action_search.png │ ├── holo_dark_action_share.png │ ├── holo_dark_ic_action_new.png │ ├── holo_dark_ic_action_select_all.png │ ├── holo_dark_ic_bookmark.png │ ├── holo_dark_ic_storage.png │ ├── holo_light_action_copy.png │ ├── holo_light_action_cut.png │ ├── holo_light_action_delete.png │ ├── holo_light_action_edit.png │ ├── holo_light_action_info.png │ ├── holo_light_action_remove.png │ ├── holo_light_action_search.png │ ├── holo_light_action_select_all.png │ ├── holo_light_action_share.png │ ├── holo_light_ic_action_new.png │ ├── holo_light_ic_bookmark.png │ ├── holo_light_ic_storage.png │ ├── ic_launcher.png │ ├── type_apk.png │ ├── type_config.png │ ├── type_folder.png │ ├── type_folder_empty.png │ ├── type_html.png │ ├── type_music.png │ ├── type_note.png │ ├── type_package.png │ ├── type_pdf.png │ ├── type_pic.png │ ├── type_unknown.png │ ├── type_video.png │ └── type_xml.png │ ├── drawable-xxhdpi │ ├── actionpaste.png │ ├── drawer_shadow.9.png │ ├── holo_dark_action_copy.png │ ├── holo_dark_action_cut.png │ ├── holo_dark_action_delete.png │ ├── holo_dark_action_edit.png │ ├── holo_dark_action_info.png │ ├── holo_dark_action_remove.png │ ├── holo_dark_action_search.png │ ├── holo_dark_action_share.png │ ├── holo_dark_ic_action_new.png │ ├── holo_dark_ic_action_select_all.png │ ├── holo_dark_ic_storage.png │ ├── holo_light_action_copy.png │ ├── holo_light_action_cut.png │ ├── holo_light_action_delete.png │ ├── holo_light_action_edit.png │ ├── holo_light_action_info.png │ ├── holo_light_action_remove.png │ ├── holo_light_action_search.png │ ├── holo_light_action_select_all.png │ ├── holo_light_action_share.png │ ├── holo_light_ic_action_new.png │ ├── holo_light_ic_storage.png │ ├── ic_launcher.png │ ├── type_apk.png │ ├── type_config.png │ ├── type_folder.png │ ├── type_folder_empty.png │ ├── type_html.png │ ├── type_music.png │ ├── type_note.png │ ├── type_package.png │ ├── type_pdf.png │ ├── type_pic.png │ ├── type_unknown.png │ ├── type_video.png │ └── type_xml.png │ ├── drawable-xxxhdpi │ └── ic_launcher.png │ ├── layout │ ├── activity_browser.xml │ ├── activity_search.xml │ ├── activity_settings.xml │ ├── dialog_directory_info.xml │ ├── dialog_exists.xml │ ├── dialog_groupowner.xml │ ├── dialog_permissions.xml │ ├── dialog_properties.xml │ ├── dialog_properties_container.xml │ ├── fragment_browser.xml │ ├── item_bookmark.xml │ ├── item_browserlist.xml │ ├── item_drawermenu.xml │ ├── item_navigation_divider.xml │ └── support_toolbar.xml │ ├── menu │ ├── actionmode.xml │ ├── fab_menu.xml │ ├── main.xml │ └── search_menu.xml │ ├── values-bg │ └── strings.xml │ ├── values-bs │ └── strings.xml │ ├── values-cs │ └── strings.xml │ ├── values-de │ └── strings.xml │ ├── values-es │ └── strings.xml │ ├── values-fa │ └── strings.xml │ ├── values-fi │ └── strings.xml │ ├── values-fr │ └── strings.xml │ ├── values-hu │ └── strings.xml │ ├── values-it │ └── strings.xml │ ├── values-ja │ └── strings.xml │ ├── values-nl │ └── strings.xml │ ├── values-pl │ └── strings.xml │ ├── values-pt-rBR │ └── strings.xml │ ├── values-pt-rPT │ └── strings.xml │ ├── values-ro │ └── strings.xml │ ├── values-ru │ └── strings.xml │ ├── values-sk │ └── strings.xml │ ├── values-sv │ └── strings.xml │ ├── values-th │ └── strings.xml │ ├── values-tr │ └── strings.xml │ ├── values-uk │ └── strings.xml │ ├── values-vi │ └── strings.xml │ ├── values-zh-rCN │ └── strings.xml │ ├── values-zh-rTW │ └── strings.xml │ ├── values │ ├── array.xml │ ├── attrs.xml │ ├── color.xml │ ├── defaults.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── preferences.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── libraries └── FloatingActionButton │ ├── AndroidManifest.xml │ ├── build.gradle │ ├── res │ └── values │ │ └── attrs.xml │ └── src │ └── com │ └── faizmalkani │ └── floatingactionbutton │ ├── DirectionScrollListener.java │ └── FloatingActionButton.java ├── screenshots ├── Dark.png └── Light.png └── settings.gradle /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Eclipse 2 | *.pydevproject 3 | .project 4 | .metadata 5 | bin/ 6 | tmp/ 7 | gen/ 8 | proguard/ 9 | *.tmp 10 | *.bak 11 | *.swp 12 | *~.nib 13 | .classpath 14 | .refactorings 15 | .settings/ 16 | .loadpath 17 | lint.xml 18 | 19 | # Android Studio 20 | *.jks 21 | .DS_Store 22 | /local.properties 23 | /.idea/workspace.xml 24 | /build 25 | 26 | # External tool builders 27 | .externalToolBuilders/ 28 | 29 | # Locally stored "Eclipse launch configurations" 30 | *.launch 31 | 32 | # CDT-specific 33 | .cproject 34 | 35 | # PDT-specific 36 | .buildpath 37 | 38 | # Windows image file caches 39 | Thumbs.db 40 | ehthumbs.db 41 | 42 | # Local configuration file (sdk path, etc) 43 | local.properties 44 | gradle.properties 45 | .directory 46 | 47 | # Intellij project files 48 | *.iml 49 | *.ipr 50 | *.iws 51 | .idea/ 52 | 53 | # Gradle 54 | build 55 | .gradle -------------------------------------------------------------------------------- /Changelog: -------------------------------------------------------------------------------- 1 | Changes in the current version 2 | v. 1.0 3 | 4 | + Minor bug fixes. FYI -I Read the code, added some, deleted some to make it better. 5 | + New Icon, maybe a placeholder for now. 6 | + Snappier, more responsive 7 | + Changed some files in the root library 8 | + Fixed Crashes on giving root permissions for some Custom Roms. 9 | + More to come in the future? Hell yeah! 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #File Explorer 2 | 3 | File Explorer is based on [SimpleExplorer](https://github.com/DF1E/SimpleExplorer) 4 | 5 | File Explorer functions as a normal file explorer, as well as Root Explorer (Root Required Obviously) 6 | 7 | #Why Should You Use File-Explorer? 8 | 9 | + It is based on awesome [SimpleExplorer](https://github.com/DF1E/SimpleExplorer) by [DF1E](https://github.com/DF1E) 10 | + Root Explorer 11 | + Awesome Features 12 | + Open Source (Free Forever? Maybe, Depends on development) 13 | + User Flexibility 14 | + Material Design 15 | + Highly Responsive 16 | 17 | 18 | #Soooo, If this is based on SimpleExplorer, What makes it different from that? 19 | 20 | See, Although I agree that the design is based on SimpleExplorer, and with full credits [to the maker](https://github.com/DF1E), 21 | The app has many more improvements for smoother functioning and better root access through updated libraries. More features and improvements are planned for the coming days, weeks, months and years until everyone is fully satisfied. Although, Some features may be buggy, and cause crashes. 22 | 23 | If you do face crashes, in any form, Please report an Issue. 24 | 25 | 26 | Click [here](https://github.com/maysleazy/File-Explorer#changes-in-the-current-version) for changes in the current version 27 | 28 | 29 | #Screenshots 30 | 31 | 32 | ##Light Theme 33 | ![Light Version Screenshot](https://raw.githubusercontent.com/maysleazy/File-Explorer/master/screenshots/Light.png) 34 | 35 | 36 | ##Dark Theme 37 | ![Dark Version Screenshot](https://raw.githubusercontent.com/maysleazy/File-Explorer/master/screenshots/Dark.png) 38 | 39 | 40 | 41 | #License 42 | 43 | 44 | ```` 45 | Copyright 2015 balzathor 46 | 47 | This program is free software; you can redistribute it and/or 48 | modify it under the terms of the GNU General Public License 49 | as published by the Free Software Foundation; either version 3 50 | of the License, or (at your option) any later version. 51 | 52 | This program is distributed in the hope that it will be useful, 53 | but WITHOUT ANY WARRANTY; without even the implied warranty of 54 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 55 | GNU General Public License for more details. 56 | 57 | You should have received a copy of the GNU General Public License 58 | along with this program; if not, write to the Free Software 59 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 60 | MA 02110-1301, USA. 61 | 62 | More info under: https://www.gnu.org/licenses/gpl-3.0 63 | ```` 64 | 65 | #Credits 66 | 67 | + [DF1E](https://github.com/DF1E/SimpleExplorer) For Simple Explorer 68 | + [Zedd.](https://forum.xda-developers.com/member.php?u=4112951) for the icons 69 | + [Android-ViewPagerIndicator](https://github.com/JakeWharton/Android-ViewPagerIndicator) by JakeWharton 70 | + [FloatingActionButton](https://github.com/FaizMalkani/FloatingActionButton) by FaizMalkani 71 | + [RootTools](https://github.com/Stericson/RootTools) library 72 | 73 | 74 | #Changes in the current version 75 | 76 | v. 1.0 77 | ```` 78 | + Minor bug fixes. FYI -I Read the code, added some, deleted some to make it better. 79 | + New Icon, maybe a placeholder for now. 80 | + Snappier, more responsive. 81 | + Changed some files in the root library. 82 | + Fixed Crashes on giving root permissions for some Custom Roms. 83 | + More to come in the future? Hell yeah! 84 | 85 | ```` 86 | 87 | v. 1.0.1 88 | ```` 89 | 90 | + Changed a few root commands. 91 | + Fixed a major bug where "Change group/owner" for blank folder would result in app crash. 92 | + Plans to add changelog at first screen after upgrading app. 93 | + Minor Changes 94 | 95 | ```` 96 | 97 | #Regarding Issues and Pull Requests 98 | 99 | 100 | Well, new ideas and bug reports are always welcome :) 101 | 102 | 103 | -------------------------------------------------------------------------------- /TODO: -------------------------------------------------------------------------------- 1 | TODO: 2 | ========================================================== 3 | - fix fileobserver not working some dirs (e.g. /data) 4 | 5 | - add gridview 6 | 7 | - improve shortcut 8 | 9 | - show progress on asynctasks 10 | 11 | - custom search preferences 12 | 13 | - fix creating thumbnail after move/copy some files 14 | 15 | - fix: after changing theme the current fragment won't be continued 16 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:1.0.0+' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | jcenter() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /explorer/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | explorer-release.apk 3 | manifest-merger-release-report.txt -------------------------------------------------------------------------------- /explorer/File-Explorer/.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /explorer/File-Explorer/.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear on external disk 35 | .Spotlight-V100 36 | .Trashes 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | -------------------------------------------------------------------------------- /explorer/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 21 5 | buildToolsVersion "21.1.2" 6 | 7 | defaultConfig { 8 | applicationId "com.mustardlabs.explorer" 9 | minSdkVersion 16 10 | targetSdkVersion 21 11 | versionCode 2 12 | versionName "1.0.1" 13 | } 14 | 15 | lintOptions { 16 | abortOnError false 17 | disable 'MissingTranslation', 'ExtraTranslation' 18 | } 19 | 20 | buildTypes { 21 | release { 22 | minifyEnabled true 23 | proguardFiles 'proguard-android.txt' 24 | } 25 | } 26 | 27 | compileOptions { 28 | sourceCompatibility JavaVersion.VERSION_1_7 29 | targetCompatibility JavaVersion.VERSION_1_7 30 | } 31 | } 32 | 33 | dependencies { 34 | compile fileTree(dir: 'libs', include: ['*.jar']) 35 | compile project(':libraries:FloatingActionButton') 36 | compile 'com.android.support:support-v13:21.0.+' 37 | compile 'com.android.support:appcompat-v7:21.0.+' 38 | } 39 | -------------------------------------------------------------------------------- /explorer/libs/RootTools-4.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/libs/RootTools-4.2.jar -------------------------------------------------------------------------------- /explorer/proguard-android.txt: -------------------------------------------------------------------------------- 1 | # This is a configuration file for ProGuard. 2 | # http://proguard.sourceforge.net/index.html#manual/usage.html 3 | 4 | -dontusemixedcaseclassnames 5 | -dontskipnonpubliclibraryclasses 6 | -verbose 7 | 8 | # Optimization is turned off by default. Dex does not like code run 9 | # through the ProGuard optimize and preverify steps (and performs some 10 | # of these optimizations on its own). 11 | -dontoptimize 12 | -dontpreverify 13 | # Note that if you want to enable optimization, you cannot just 14 | # include optimization flags in your own project configuration file; 15 | # instead you will need to point to the 16 | # "proguard-android-optimize.txt" file instead of this one from your 17 | # project.properties file. 18 | 19 | -keepattributes *Annotation* 20 | -keep public class com.google.vending.licensing.ILicensingService 21 | -keep public class com.android.vending.licensing.ILicensingService 22 | 23 | # For native methods, see http://proguard.sourceforge.net/manual/examples.html#native 24 | -keepclasseswithmembernames class * { 25 | native ; 26 | } 27 | 28 | # keep setters in Views so that animations can still work. 29 | # see http://proguard.sourceforge.net/manual/examples.html#beans 30 | -keepclassmembers public class * extends android.view.View { 31 | void set*(***); 32 | *** get*(); 33 | } 34 | 35 | # We want to keep methods in Activity that could be used in the XML attribute onClick 36 | -keepclassmembers class * extends android.app.Activity { 37 | public void *(android.view.View); 38 | } 39 | 40 | # For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations 41 | -keepclassmembers enum * { 42 | public static **[] values(); 43 | public static ** valueOf(java.lang.String); 44 | } 45 | 46 | -keep class * implements android.os.Parcelable { 47 | public static final android.os.Parcelable$Creator *; 48 | } 49 | 50 | -keepclassmembers class **.R$* { 51 | public static ; 52 | } 53 | 54 | # The support library contains references to newer platform versions. 55 | # Don't warn about those in case this app is linking against an older 56 | # platform version. We know about them, and they are safe. 57 | -dontwarn android.support.** 58 | 59 | # === custom === 60 | # this fixed a bug with SearchView on Cyanogenmod 61 | -keep public class android.support.v7.widget.** { *; } 62 | -------------------------------------------------------------------------------- /explorer/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 20 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 36 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/ThemableActivity.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.ActionBarActivity; 6 | 7 | import com.dnielfe.manager.settings.Settings; 8 | 9 | public abstract class ThemableActivity extends ActionBarActivity { 10 | 11 | private int mCurrentTheme; 12 | 13 | @Override 14 | protected void onCreate(Bundle savedInstanceState) { 15 | // get default preferences at start - we need this for setting the theme 16 | Settings.updatePreferences(this); 17 | 18 | mCurrentTheme = Settings.mTheme; 19 | setTheme(mCurrentTheme); 20 | super.onCreate(savedInstanceState); 21 | } 22 | 23 | @Override 24 | protected void onResume() { 25 | super.onResume(); 26 | if (mCurrentTheme != Settings.mTheme) { 27 | restart(); 28 | } 29 | } 30 | 31 | protected void restart() { 32 | final Bundle outState = new Bundle(); 33 | onSaveInstanceState(outState); 34 | final Intent intent = new Intent(this, getClass()); 35 | finish(); 36 | overridePendingTransition(0, 0); 37 | startActivity(intent); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/adapters/BookmarksAdapter.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.adapters; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.View.OnClickListener; 7 | import android.view.ViewGroup; 8 | import android.widget.BaseAdapter; 9 | import android.widget.ImageButton; 10 | import android.widget.TextView; 11 | 12 | import com.dnielfe.manager.R; 13 | import com.dnielfe.manager.utils.Bookmark; 14 | import com.dnielfe.manager.utils.BookmarksHelper; 15 | 16 | import java.io.File; 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | public class BookmarksAdapter extends BaseAdapter { 21 | 22 | private final LayoutInflater mLayoutInflater; 23 | private List mBookmarksList = new ArrayList<>(); 24 | private BookmarksHelper db; 25 | 26 | public BookmarksAdapter(Context context) { 27 | mLayoutInflater = LayoutInflater.from(context); 28 | db = new BookmarksHelper(context); 29 | 30 | mBookmarksList = db.getAllBooks(); 31 | } 32 | 33 | @Override 34 | public View getView(final int position, View convertView, ViewGroup parent) { 35 | final ViewHolder viewHolder; 36 | final Bookmark bm = getItem(position); 37 | 38 | if (convertView == null) { 39 | convertView = mLayoutInflater.inflate(R.layout.item_bookmark, parent, false); 40 | viewHolder = new ViewHolder(convertView); 41 | convertView.setTag(viewHolder); 42 | } else { 43 | viewHolder = (ViewHolder) convertView.getTag(); 44 | } 45 | 46 | viewHolder.title.setText(bm.getName()); 47 | viewHolder.path.setText(bm.getPath()); 48 | viewHolder.remove.setOnClickListener(new OnClickListener() { 49 | 50 | @Override 51 | public void onClick(View arg0) { 52 | db.deleteBook(bm); 53 | updateList(); 54 | } 55 | }); 56 | 57 | return convertView; 58 | } 59 | 60 | public void createBookmark(File file) { 61 | db.addBookmark(new Bookmark(file.getName(), file.getPath())); 62 | updateList(); 63 | } 64 | 65 | // TODO: find a better solution for refreshing ListView 66 | private void updateList() { 67 | if (!mBookmarksList.isEmpty()) 68 | mBookmarksList.clear(); 69 | 70 | mBookmarksList = db.getAllBooks(); 71 | notifyDataSetChanged(); 72 | } 73 | 74 | @Override 75 | public Bookmark getItem(int pos) { 76 | return mBookmarksList.get(pos); 77 | } 78 | 79 | @Override 80 | public int getCount() { 81 | return mBookmarksList.size(); 82 | } 83 | 84 | @Override 85 | public long getItemId(int position) { 86 | return position; 87 | } 88 | 89 | private class ViewHolder { 90 | final ImageButton remove; 91 | final TextView title; 92 | final TextView path; 93 | 94 | ViewHolder(View v) { 95 | title = (TextView) v.findViewById(R.id.title); 96 | path = (TextView) v.findViewById(R.id.path); 97 | remove = (ImageButton) v.findViewById(R.id.imageButton_remove); 98 | } 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/adapters/BrowserListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.adapters; 2 | 3 | import android.content.Context; 4 | import android.content.res.Resources; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.BaseAdapter; 9 | import android.widget.ImageView; 10 | import android.widget.TextView; 11 | 12 | import com.dnielfe.manager.R; 13 | import com.dnielfe.manager.preview.IconPreview; 14 | import com.dnielfe.manager.settings.Settings; 15 | import com.dnielfe.manager.utils.SimpleUtils; 16 | import com.dnielfe.manager.utils.SortUtils; 17 | 18 | import java.io.File; 19 | import java.text.DateFormat; 20 | import java.util.ArrayList; 21 | import java.util.Locale; 22 | 23 | public class BrowserListAdapter extends BaseAdapter { 24 | private final LayoutInflater mInflater; 25 | private final Resources mResources; 26 | private ArrayList mDataSource; 27 | private final Context mContext; 28 | 29 | public BrowserListAdapter(Context context, LayoutInflater inflater) { 30 | mInflater = inflater; 31 | mContext = context; 32 | mDataSource = new ArrayList<>(); 33 | mResources = context.getResources(); 34 | } 35 | 36 | @Override 37 | public View getView(int position, View convertView, ViewGroup parent) { 38 | final ViewHolder mViewHolder; 39 | int num_items = 0; 40 | final File file = new File(getItem(position)); 41 | DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, 42 | DateFormat.SHORT, Locale.getDefault()); 43 | 44 | if (convertView == null) { 45 | convertView = mInflater.inflate(R.layout.item_browserlist, parent, 46 | false); 47 | mViewHolder = new ViewHolder(convertView); 48 | convertView.setTag(mViewHolder); 49 | } else { 50 | mViewHolder = (ViewHolder) convertView.getTag(); 51 | } 52 | 53 | if (Settings.mListAppearance > 0) { 54 | mViewHolder.dateview.setVisibility(TextView.VISIBLE); 55 | } else { 56 | mViewHolder.dateview.setVisibility(TextView.GONE); 57 | } 58 | 59 | // get icon 60 | IconPreview.getFileIcon(file, mViewHolder.icon); 61 | 62 | if (file.isFile()) { 63 | // Shows the size of File 64 | mViewHolder.bottomView.setText(SimpleUtils.formatCalculatedSize(file.length())); 65 | } else { 66 | String[] list = file.list(); 67 | 68 | if (list != null) 69 | num_items = list.length; 70 | 71 | // show the number of files in Folder 72 | mViewHolder.bottomView.setText(num_items 73 | + mResources.getString(R.string.files)); 74 | } 75 | 76 | mViewHolder.topView.setText(file.getName()); 77 | mViewHolder.dateview.setText(df.format(file.lastModified())); 78 | 79 | return convertView; 80 | } 81 | 82 | private static class ViewHolder { 83 | final TextView topView; 84 | final TextView bottomView; 85 | final TextView dateview; 86 | final ImageView icon; 87 | 88 | ViewHolder(View view) { 89 | topView = (TextView) view.findViewById(R.id.top_view); 90 | bottomView = (TextView) view.findViewById(R.id.bottom_view); 91 | dateview = (TextView) view.findViewById(R.id.dateview); 92 | icon = (ImageView) view.findViewById(R.id.row_image); 93 | } 94 | } 95 | 96 | public void addFiles(String path) { 97 | if (!mDataSource.isEmpty()) 98 | mDataSource.clear(); 99 | 100 | mDataSource = SimpleUtils.listFiles(path, mContext); 101 | 102 | // sort files with a comparator if not empty 103 | if (!mDataSource.isEmpty()) 104 | SortUtils.sortList(mDataSource, path); 105 | 106 | notifyDataSetChanged(); 107 | } 108 | 109 | public void addContent(ArrayList files) { 110 | if (!mDataSource.isEmpty()) 111 | mDataSource.clear(); 112 | 113 | mDataSource = files; 114 | 115 | notifyDataSetChanged(); 116 | } 117 | 118 | public int getPosition(String path) { 119 | return mDataSource.indexOf(path); 120 | } 121 | 122 | public ArrayList getContent() { 123 | return mDataSource; 124 | } 125 | 126 | @Override 127 | public String getItem(int pos) { 128 | return mDataSource.get(pos); 129 | } 130 | 131 | @Override 132 | public int getCount() { 133 | return mDataSource.size(); 134 | } 135 | 136 | @Override 137 | public long getItemId(int position) { 138 | return position; 139 | } 140 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/adapters/BrowserTabsAdapter.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.adapters; 2 | 3 | import android.app.Fragment; 4 | import android.app.FragmentManager; 5 | import android.support.v13.app.FragmentStatePagerAdapter; 6 | import android.view.ViewGroup; 7 | 8 | import com.dnielfe.manager.fragments.BrowserFragment; 9 | 10 | public class BrowserTabsAdapter extends FragmentStatePagerAdapter { 11 | 12 | // number of fragments 13 | private static final int NUM_PAGES = 2; 14 | 15 | private static Fragment mCurrentFragment; 16 | 17 | public BrowserTabsAdapter(FragmentManager fm) { 18 | super(fm); 19 | } 20 | 21 | public static BrowserFragment getCurrentBrowserFragment() { 22 | return (BrowserFragment) mCurrentFragment; 23 | } 24 | 25 | @Override 26 | public Fragment getItem(int pos) { 27 | switch (pos) { 28 | case 0: 29 | new BrowserFragment(); 30 | case 1: 31 | new BrowserFragment(); 32 | default: 33 | return new BrowserFragment(); 34 | } 35 | } 36 | 37 | @Override 38 | public int getCount() { 39 | return NUM_PAGES; 40 | } 41 | 42 | @Override 43 | public void setPrimaryItem(ViewGroup container, int position, Object object) { 44 | if (mCurrentFragment != object) { 45 | mCurrentFragment = ((Fragment) object); 46 | } 47 | super.setPrimaryItem(container, position, object); 48 | } 49 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/adapters/DrawerListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.adapters; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.BaseAdapter; 8 | import android.widget.TextView; 9 | 10 | import com.dnielfe.manager.R; 11 | 12 | public class DrawerListAdapter extends BaseAdapter { 13 | private final Context mContext; 14 | private final String[] mTitle; 15 | 16 | public DrawerListAdapter(final Context context) { 17 | this.mContext = context; 18 | this.mTitle = context.getResources().getStringArray( 19 | R.array.drawerTitles_array); 20 | } 21 | 22 | public View getView(int position, View convertView, ViewGroup parent) { 23 | ViewHolder holder; 24 | 25 | if (convertView == null) { 26 | LayoutInflater inflater = (LayoutInflater) mContext 27 | .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 28 | convertView = inflater.inflate(R.layout.item_drawermenu, parent, 29 | false); 30 | holder = new ViewHolder(convertView); 31 | convertView.setTag(holder); 32 | } else { 33 | holder = (ViewHolder) convertView.getTag(); 34 | } 35 | 36 | holder.title.setText(mTitle[position]); 37 | return convertView; 38 | } 39 | 40 | @Override 41 | public int getCount() { 42 | return mTitle.length; 43 | } 44 | 45 | @Override 46 | public Object getItem(int position) { 47 | return mTitle[position]; 48 | } 49 | 50 | @Override 51 | public long getItemId(int position) { 52 | return position; 53 | } 54 | 55 | private class ViewHolder { 56 | public TextView title = null; 57 | 58 | ViewHolder(View row) { 59 | title = (TextView) row.findViewById(R.id.title); 60 | } 61 | } 62 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/dialogs/CreateFileDialog.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.dialogs; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.app.Dialog; 6 | import android.app.DialogFragment; 7 | import android.content.DialogInterface; 8 | import android.os.Bundle; 9 | import android.widget.EditText; 10 | import android.widget.Toast; 11 | 12 | import com.dnielfe.manager.R; 13 | import com.dnielfe.manager.adapters.BrowserTabsAdapter; 14 | import com.dnielfe.manager.settings.Settings; 15 | import com.dnielfe.manager.utils.RootCommands; 16 | 17 | import java.io.File; 18 | 19 | public final class CreateFileDialog extends DialogFragment { 20 | 21 | @Override 22 | public Dialog onCreateDialog(Bundle savedInstanceState) { 23 | final Activity a = getActivity(); 24 | 25 | // Set an EditText view to get user input 26 | final EditText inputf = new EditText(a); 27 | inputf.setHint(R.string.enter_name); 28 | 29 | final AlertDialog.Builder b = new AlertDialog.Builder(a); 30 | b.setTitle(R.string.newfile); 31 | b.setView(inputf); 32 | b.setPositiveButton(R.string.create, 33 | new DialogInterface.OnClickListener() { 34 | @Override 35 | public void onClick(DialogInterface dialog, int which) { 36 | String name = inputf.getText().toString(); 37 | String path = BrowserTabsAdapter.getCurrentBrowserFragment().mCurrentPath; 38 | boolean success = false; 39 | 40 | File file = new File(path + File.separator + name); 41 | 42 | if (file.exists()) 43 | Toast.makeText(a, getString(R.string.fileexists), 44 | Toast.LENGTH_SHORT).show(); 45 | 46 | try { 47 | if (name.length() >= 1) 48 | success = file.createNewFile(); 49 | } catch (Exception e) { 50 | if (Settings.rootAccess()) 51 | success = RootCommands.createRootFile(path, name); 52 | } 53 | 54 | if (success) 55 | Toast.makeText(a, R.string.filecreated, 56 | Toast.LENGTH_SHORT).show(); 57 | else 58 | Toast.makeText(a, R.string.error, 59 | Toast.LENGTH_SHORT).show(); 60 | 61 | dialog.dismiss(); 62 | } 63 | }); 64 | b.setNegativeButton(R.string.cancel, 65 | new DialogInterface.OnClickListener() { 66 | @Override 67 | public void onClick(DialogInterface dialog, int which) { 68 | dialog.dismiss(); 69 | } 70 | }); 71 | return b.create(); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/dialogs/CreateFolderDialog.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.dialogs; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.app.Dialog; 6 | import android.app.DialogFragment; 7 | import android.content.DialogInterface; 8 | import android.os.Bundle; 9 | import android.widget.EditText; 10 | import android.widget.Toast; 11 | 12 | import com.dnielfe.manager.R; 13 | import com.dnielfe.manager.adapters.BrowserTabsAdapter; 14 | import com.dnielfe.manager.utils.SimpleUtils; 15 | 16 | public final class CreateFolderDialog extends DialogFragment { 17 | 18 | @Override 19 | public Dialog onCreateDialog(Bundle savedInstanceState) { 20 | final Activity a = getActivity(); 21 | 22 | // Set an EditText view to get user input 23 | final EditText inputf = new EditText(a); 24 | inputf.setHint(R.string.enter_name); 25 | 26 | final AlertDialog.Builder b = new AlertDialog.Builder(a); 27 | b.setTitle(R.string.createnewfolder); 28 | b.setMessage(R.string.createmsg); 29 | b.setView(inputf); 30 | b.setPositiveButton(R.string.create, 31 | new DialogInterface.OnClickListener() { 32 | @Override 33 | public void onClick(DialogInterface dialog, int which) { 34 | String name = inputf.getText().toString(); 35 | boolean success = false; 36 | 37 | if (name.length() >= 1) 38 | success = SimpleUtils.createDir( 39 | BrowserTabsAdapter.getCurrentBrowserFragment().mCurrentPath, 40 | name); 41 | 42 | if (success) 43 | Toast.makeText(a, 44 | name + getString(R.string.created), 45 | Toast.LENGTH_LONG).show(); 46 | else 47 | Toast.makeText(a, 48 | getString(R.string.newfolderwasnotcreated), 49 | Toast.LENGTH_SHORT).show(); 50 | 51 | dialog.dismiss(); 52 | } 53 | }); 54 | b.setNegativeButton(R.string.cancel, 55 | new DialogInterface.OnClickListener() { 56 | @Override 57 | public void onClick(DialogInterface dialog, int which) { 58 | dialog.dismiss(); 59 | } 60 | }); 61 | return b.create(); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/dialogs/DeleteFilesDialog.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.dialogs; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.app.Dialog; 6 | import android.app.DialogFragment; 7 | import android.content.DialogInterface; 8 | import android.os.AsyncTask; 9 | import android.os.Bundle; 10 | 11 | import com.dnielfe.manager.R; 12 | import com.dnielfe.manager.tasks.DeleteTask; 13 | 14 | public final class DeleteFilesDialog extends DialogFragment { 15 | 16 | private static String[] files; 17 | 18 | public static DialogFragment instantiate(String[] files1) { 19 | files = files1; 20 | return new DeleteFilesDialog(); 21 | } 22 | 23 | @Override 24 | public Dialog onCreateDialog(Bundle state) { 25 | final Activity a = getActivity(); 26 | final int size = files.length; 27 | 28 | final AlertDialog.Builder b = new AlertDialog.Builder(a); 29 | b.setTitle(String.valueOf(size) + getString(R.string._files)); 30 | b.setMessage(R.string.cannotbeundoneareyousureyouwanttodelete); 31 | b.setPositiveButton(R.string.delete, 32 | new DialogInterface.OnClickListener() { 33 | @Override 34 | public void onClick(DialogInterface dialog, int which) { 35 | dialog.dismiss(); 36 | final DeleteTask task = new DeleteTask(a); 37 | task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 38 | files); 39 | } 40 | }); 41 | b.setNegativeButton(R.string.cancel, 42 | new DialogInterface.OnClickListener() { 43 | @Override 44 | public void onClick(DialogInterface dialog, int which) { 45 | dialog.dismiss(); 46 | } 47 | }); 48 | return b.create(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/dialogs/FileExistsDialog.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.dialogs; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.content.DialogInterface; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import com.dnielfe.manager.R; 10 | 11 | public final class FileExistsDialog extends Dialog { 12 | 13 | public FileExistsDialog(final Context context, final String source, 14 | final String target, final View.OnClickListener abortAction, 15 | final View.OnClickListener skipAction, 16 | final View.OnClickListener skipAllAction, 17 | final View.OnClickListener replaceAction, 18 | final View.OnClickListener replaceAllAction) { 19 | super(context); 20 | 21 | this.setTitle(R.string.overwrite_title); 22 | this.setContentView(R.layout.dialog_exists); 23 | 24 | this.initView(source, target, abortAction, skipAction, skipAllAction, 25 | replaceAction, replaceAllAction); 26 | } 27 | 28 | private void initView(final String sourcePath, final String targetPath, 29 | final View.OnClickListener abortAction, 30 | final View.OnClickListener skipAction, 31 | final View.OnClickListener skipAllAction, 32 | final View.OnClickListener replaceAction, 33 | final View.OnClickListener replaceAllAction) { 34 | 35 | final TextView source = (TextView) this 36 | .findViewById(android.R.id.text1); 37 | source.setText(sourcePath); 38 | 39 | final TextView target = (TextView) this 40 | .findViewById(android.R.id.text2); 41 | target.setText(targetPath); 42 | 43 | this.findViewById(android.R.id.button1).setOnClickListener( 44 | new View.OnClickListener() { 45 | @Override 46 | public void onClick(View v) { 47 | dismiss(); 48 | replaceAction.onClick(v); 49 | } 50 | }); 51 | this.findViewById(android.R.id.button2).setOnClickListener( 52 | new View.OnClickListener() { 53 | @Override 54 | public void onClick(View v) { 55 | dismiss(); 56 | replaceAllAction.onClick(v); 57 | } 58 | }); 59 | this.findViewById(android.R.id.button3).setOnClickListener( 60 | new View.OnClickListener() { 61 | @Override 62 | public void onClick(View v) { 63 | dismiss(); 64 | skipAction.onClick(v); 65 | } 66 | }); 67 | this.findViewById(R.id.button4).setOnClickListener( 68 | new View.OnClickListener() { 69 | @Override 70 | public void onClick(View v) { 71 | dismiss(); 72 | skipAllAction.onClick(v); 73 | } 74 | }); 75 | this.findViewById(R.id.button5).setOnClickListener( 76 | new View.OnClickListener() { 77 | @Override 78 | public void onClick(View v) { 79 | dismiss(); 80 | abortAction.onClick(v); 81 | } 82 | }); 83 | this.setOnCancelListener(new OnCancelListener() { 84 | @Override 85 | public void onCancel(DialogInterface dialog) { 86 | skipAllAction.onClick(findViewById(R.id.button5)); 87 | } 88 | }); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/dialogs/GroupOwnerDialog.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.dialogs; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.app.Dialog; 6 | import android.app.DialogFragment; 7 | import android.content.DialogInterface; 8 | import android.os.AsyncTask; 9 | import android.os.Bundle; 10 | import android.view.View; 11 | import android.widget.EditText; 12 | 13 | import com.dnielfe.manager.R; 14 | import com.dnielfe.manager.tasks.GroupOwnerTask; 15 | import com.dnielfe.manager.utils.RootCommands; 16 | 17 | import java.io.File; 18 | 19 | public final class GroupOwnerDialog extends DialogFragment { 20 | 21 | private static File file; 22 | private static String oldowner, oldgroup; 23 | 24 | public static DialogFragment instantiate(File file1) { 25 | file = file1; 26 | 27 | String[] mFileInfo = RootCommands.getFileProperties(file1); 28 | if (mFileInfo != null) { 29 | oldowner = mFileInfo[1]; 30 | oldgroup = mFileInfo[2]; 31 | } 32 | return new GroupOwnerDialog(); 33 | } 34 | 35 | @Override 36 | public Dialog onCreateDialog(Bundle state) { 37 | final Activity a = getActivity(); 38 | 39 | View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_groupowner, null); 40 | final EditText inputowner = (EditText) view.findViewById(R.id.owner); 41 | inputowner.setText(oldowner); 42 | 43 | final EditText inputgroup = (EditText) view.findViewById(R.id.group); 44 | inputgroup.setText(oldgroup); 45 | 46 | final AlertDialog.Builder b = new AlertDialog.Builder(a); 47 | b.setTitle(R.string.edit); 48 | b.setView(view); 49 | b.setPositiveButton(getString(R.string.ok), 50 | new DialogInterface.OnClickListener() { 51 | @Override 52 | public void onClick(DialogInterface dialog, int whichButton) { 53 | String newgroup = inputowner.getText().toString(); 54 | String newowner = inputgroup.getText().toString(); 55 | 56 | dialog.dismiss(); 57 | 58 | if (newgroup.length() > 1 && newowner.length() > 1) { 59 | final GroupOwnerTask task = new GroupOwnerTask(a, newgroup, newowner); 60 | task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, file); 61 | } 62 | } 63 | }); 64 | b.setNegativeButton(R.string.cancel, 65 | new DialogInterface.OnClickListener() { 66 | @Override 67 | public void onClick(DialogInterface dialog, int which) { 68 | dialog.dismiss(); 69 | } 70 | }); 71 | return b.create(); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/dialogs/RenameDialog.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.dialogs; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.app.Dialog; 6 | import android.app.DialogFragment; 7 | import android.content.DialogInterface; 8 | import android.os.AsyncTask; 9 | import android.os.Bundle; 10 | import android.widget.EditText; 11 | 12 | import com.dnielfe.manager.R; 13 | import com.dnielfe.manager.tasks.RenameTask; 14 | 15 | public final class RenameDialog extends DialogFragment { 16 | 17 | private static String name; 18 | 19 | public static DialogFragment instantiate(String name1) { 20 | name = name1; 21 | return new RenameDialog(); 22 | } 23 | 24 | @Override 25 | public Dialog onCreateDialog(Bundle state) { 26 | final Activity a = getActivity(); 27 | 28 | // Set an EditText view to get user input 29 | final EditText inputf = new EditText(a); 30 | inputf.setHint(R.string.enter_name); 31 | inputf.setText(name); 32 | 33 | final AlertDialog.Builder b = new AlertDialog.Builder(a); 34 | b.setTitle(R.string.rename); 35 | b.setView(inputf); 36 | 37 | b.setPositiveButton(getString(R.string.ok), 38 | new DialogInterface.OnClickListener() { 39 | public void onClick(DialogInterface dialog, int whichButton) { 40 | String newname = inputf.getText().toString(); 41 | 42 | if (inputf.getText().length() < 1) 43 | dialog.dismiss(); 44 | 45 | dialog.dismiss(); 46 | final RenameTask task = new RenameTask(a); 47 | task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 48 | name, newname); 49 | } 50 | }); 51 | b.setNegativeButton(R.string.cancel, 52 | new DialogInterface.OnClickListener() { 53 | @Override 54 | public void onClick(DialogInterface dialog, int which) { 55 | dialog.dismiss(); 56 | } 57 | }); 58 | return b.create(); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/dialogs/UnpackDialog.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.dialogs; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.app.Dialog; 6 | import android.app.DialogFragment; 7 | import android.content.DialogInterface; 8 | import android.os.AsyncTask; 9 | import android.os.Bundle; 10 | import android.widget.EditText; 11 | 12 | import com.dnielfe.manager.R; 13 | import com.dnielfe.manager.adapters.BrowserTabsAdapter; 14 | import com.dnielfe.manager.tasks.ExtractionTask; 15 | 16 | import java.io.File; 17 | 18 | public final class UnpackDialog extends DialogFragment { 19 | 20 | private static File file; 21 | 22 | public static DialogFragment instantiate(File file1) { 23 | file = file1; 24 | return new UnpackDialog(); 25 | } 26 | 27 | @Override 28 | public Dialog onCreateDialog(Bundle state) { 29 | final Activity a = getActivity(); 30 | 31 | // Set an EditText view to get user input 32 | final EditText inputf = new EditText(a); 33 | inputf.setHint(R.string.enter_name); 34 | inputf.setText(BrowserTabsAdapter.getCurrentBrowserFragment().mCurrentPath + "/"); 35 | 36 | final AlertDialog.Builder b = new AlertDialog.Builder(a); 37 | b.setTitle(R.string.extractto); 38 | b.setView(inputf); 39 | b.setPositiveButton(getString(R.string.ok), 40 | new DialogInterface.OnClickListener() { 41 | @Override 42 | public void onClick(DialogInterface dialog, int whichButton) { 43 | String newpath = inputf.getText().toString(); 44 | 45 | dialog.dismiss(); 46 | 47 | final ExtractionTask task = new ExtractionTask(a); 48 | task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, file, 49 | new File(newpath)); 50 | } 51 | }); 52 | b.setNegativeButton(R.string.cancel, 53 | new DialogInterface.OnClickListener() { 54 | @Override 55 | public void onClick(DialogInterface dialog, int which) { 56 | dialog.dismiss(); 57 | } 58 | }); 59 | return b.create(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/dialogs/ZipFilesDialog.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.dialogs; 2 | 3 | import android.app.Activity; 4 | import android.app.AlertDialog; 5 | import android.app.Dialog; 6 | import android.app.DialogFragment; 7 | import android.content.DialogInterface; 8 | import android.os.AsyncTask; 9 | import android.os.Bundle; 10 | import android.widget.EditText; 11 | import android.widget.Toast; 12 | 13 | import com.dnielfe.manager.R; 14 | import com.dnielfe.manager.adapters.BrowserTabsAdapter; 15 | import com.dnielfe.manager.tasks.ZipTask; 16 | 17 | import java.io.File; 18 | 19 | public final class ZipFilesDialog extends DialogFragment { 20 | 21 | private static String[] files; 22 | 23 | public static DialogFragment instantiate(String[] files1) { 24 | files = files1; 25 | return new ZipFilesDialog(); 26 | } 27 | 28 | @Override 29 | public Dialog onCreateDialog(Bundle state) { 30 | final Activity a = getActivity(); 31 | final String zipfile = BrowserTabsAdapter.getCurrentBrowserFragment().mCurrentPath 32 | + "/" + "zipfile.zip"; 33 | final int size = files.length; 34 | 35 | // Set an EditText view to get user input 36 | final EditText inputf = new EditText(a); 37 | inputf.setHint(R.string.enter_name); 38 | inputf.setText(zipfile); 39 | 40 | final AlertDialog.Builder b = new AlertDialog.Builder(a); 41 | b.setTitle(getString(R.string.packing) + " (" + String.valueOf(size) + ")"); 42 | b.setView(inputf); 43 | b.setPositiveButton(getString(R.string.ok), 44 | new DialogInterface.OnClickListener() { 45 | public void onClick(DialogInterface dialog, int whichButton) { 46 | String newpath = inputf.getText().toString(); 47 | File file = new File(newpath); 48 | 49 | if (file.exists()) { 50 | Toast.makeText(a, a.getString(R.string.fileexists), 51 | Toast.LENGTH_SHORT).show(); 52 | return; 53 | } 54 | 55 | dialog.dismiss(); 56 | final ZipTask task = new ZipTask(a, newpath); 57 | task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, files); 58 | } 59 | }); 60 | b.setNegativeButton(R.string.cancel, 61 | new DialogInterface.OnClickListener() { 62 | @Override 63 | public void onClick(DialogInterface dialog, int which) { 64 | dialog.dismiss(); 65 | } 66 | }); 67 | return b.create(); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/fileobserver/FileObserverCache.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.fileobserver; 2 | 3 | import java.lang.ref.WeakReference; 4 | import java.util.HashMap; 5 | import java.util.Map; 6 | 7 | public final class FileObserverCache { 8 | 9 | private static FileObserverCache instance; 10 | 11 | public static FileObserverCache getInstance() { 12 | if (instance == null) { 13 | instance = new FileObserverCache(); 14 | } 15 | return instance; 16 | } 17 | 18 | private final Map> cache; 19 | 20 | private FileObserverCache() { 21 | this.cache = new HashMap<>(); 22 | } 23 | 24 | public void clear() { 25 | this.cache.clear(); 26 | } 27 | 28 | public MultiFileObserver getOrCreate(final String path) { 29 | final WeakReference reference = cache.get(path); 30 | MultiFileObserver observer; 31 | if (reference != null && (observer = reference.get()) != null) { 32 | return observer; 33 | } else { 34 | observer = new MultiFileObserver(path); 35 | this.cache 36 | .put(path, new WeakReference<>(observer)); 37 | } 38 | return observer; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/fileobserver/MultiFileObserver.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.fileobserver; 2 | 3 | import android.os.FileObserver; 4 | 5 | import java.util.HashSet; 6 | import java.util.Set; 7 | 8 | public final class MultiFileObserver extends FileObserver { 9 | 10 | public interface OnEventListener { 11 | void onEvent(int event, String path); 12 | } 13 | 14 | public final Set listeners; 15 | private final String path; 16 | 17 | private int watchCount; 18 | 19 | public MultiFileObserver(String path) { 20 | this(path, ALL_EVENTS); 21 | } 22 | 23 | private MultiFileObserver(String path, int mask) { 24 | super(path, FileObserver.ALL_EVENTS); 25 | this.path = path; 26 | this.listeners = new HashSet<>(); 27 | } 28 | 29 | public void addOnEventListener(final OnEventListener listener) { 30 | this.listeners.add(listener); 31 | } 32 | 33 | public void removeOnEventListener(final OnEventListener listener) { 34 | this.listeners.remove(listener); 35 | } 36 | 37 | @Override 38 | public void onEvent(final int event, final String pathStub) { 39 | for (final OnEventListener listener : this.listeners) { 40 | listener.onEvent(event, this.path); 41 | } 42 | } 43 | 44 | @Override 45 | public synchronized void startWatching() { 46 | super.startWatching(); 47 | this.watchCount++; 48 | } 49 | 50 | @Override 51 | public synchronized void stopWatching() { 52 | if (--this.watchCount <= 0) { 53 | if (this.watchCount < 0) { 54 | this.watchCount = 0; 55 | } 56 | super.stopWatching(); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/fragments/UserVisibleHintFragment.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.fragments; 2 | 3 | import android.app.Fragment; 4 | 5 | /** 6 | * Fragment that manages resumed and visible states combining them 7 | */ 8 | public abstract class UserVisibleHintFragment extends Fragment { 9 | 10 | private boolean mResumed; 11 | 12 | @Override 13 | public final void setUserVisibleHint(boolean isVisibleToUser) { 14 | final boolean needUpdate = mResumed 15 | && isVisibleToUser != this.getUserVisibleHint(); 16 | super.setUserVisibleHint(isVisibleToUser); 17 | if (needUpdate) { 18 | if (isVisibleToUser) { 19 | this.onVisible(); 20 | } else { 21 | this.onInvisible(); 22 | } 23 | } 24 | } 25 | 26 | @Override 27 | public final void onResume() { 28 | super.onResume(); 29 | mResumed = true; 30 | if (this.getUserVisibleHint()) { 31 | this.onVisible(); 32 | } 33 | } 34 | 35 | @Override 36 | public final void onPause() { 37 | super.onPause(); 38 | mResumed = false; 39 | this.onInvisible(); 40 | } 41 | 42 | /** 43 | * Called when onResume was called and userVisibleHint is set to true or 44 | * vice-versa 45 | */ 46 | protected abstract void onVisible(); 47 | 48 | /** 49 | * Called when onStop was called or userVisibleHint is set to false 50 | */ 51 | protected abstract void onInvisible(); 52 | } 53 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/preview/BitmapLruCache.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.preview; 2 | 3 | import android.graphics.Bitmap; 4 | import android.util.LruCache; 5 | 6 | public final class BitmapLruCache extends LruCache { 7 | 8 | public BitmapLruCache() { 9 | super(512 * 1024); 10 | } 11 | 12 | @Override 13 | protected int sizeOf(T key, Bitmap value) { 14 | return value.getByteCount() / 1024; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/preview/DrawableLruCache.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.preview; 2 | 3 | import android.graphics.drawable.BitmapDrawable; 4 | import android.graphics.drawable.Drawable; 5 | import android.util.LruCache; 6 | 7 | public final class DrawableLruCache extends LruCache { 8 | 9 | public DrawableLruCache() { 10 | super(512 * 1024); 11 | } 12 | 13 | @Override 14 | protected int sizeOf(T key, Drawable value) { 15 | if (value instanceof BitmapDrawable) { 16 | return ((BitmapDrawable) value).getBitmap().getByteCount() / 1024; 17 | } else { 18 | return super.sizeOf(key, value); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/settings/Settings.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.settings; 2 | 3 | import android.content.Context; 4 | import android.content.SharedPreferences; 5 | import android.os.Environment; 6 | import android.preference.PreferenceManager; 7 | 8 | import com.dnielfe.manager.R; 9 | import com.stericson.RootTools.RootTools; 10 | 11 | public final class Settings { 12 | 13 | private static boolean showthumbnail; 14 | private static boolean mShowHiddenFiles; 15 | private static boolean mRootAccess; 16 | private static boolean reverseList; 17 | public static int mListAppearance; 18 | public static int mSortType; 19 | public static int mTheme; 20 | private static String defaultdir; 21 | 22 | public static void updatePreferences(Context context) { 23 | SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(context); 24 | 25 | mShowHiddenFiles = p.getBoolean("displayhiddenfiles", true); 26 | showthumbnail = p.getBoolean("showpreview", true); 27 | mRootAccess = p.getBoolean("enablerootaccess", false); 28 | reverseList = p.getBoolean("reverseList", false); 29 | mTheme = Integer.parseInt(p.getString("preference_theme", 30 | Integer.toString(R.style.ThemeLight))); 31 | mSortType = Integer.parseInt(p.getString("sort", "1")); 32 | mListAppearance = Integer.parseInt(p.getString("viewmode", "1")); 33 | defaultdir = p.getString("defaultdir", Environment 34 | .getExternalStorageDirectory().getPath()); 35 | 36 | rootAccess(); 37 | } 38 | 39 | public static boolean showThumbnail() { 40 | return showthumbnail; 41 | } 42 | 43 | public static boolean showHiddenFiles() { 44 | return mShowHiddenFiles; 45 | } 46 | 47 | public static boolean rootAccess() { 48 | return mRootAccess && RootTools.isAccessGiven(); 49 | } 50 | 51 | public static boolean reverseListView() { 52 | return reverseList; 53 | } 54 | 55 | public static String getDefaultDir() { 56 | return defaultdir; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/settings/SettingsActivity.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.settings; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.widget.Toolbar; 6 | import android.view.MenuItem; 7 | 8 | import com.dnielfe.manager.BrowserActivity; 9 | import com.dnielfe.manager.R; 10 | import com.dnielfe.manager.ThemableActivity; 11 | 12 | public class SettingsActivity extends ThemableActivity { 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_settings); 18 | 19 | // set up ActionBar 20 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 21 | setSupportActionBar(toolbar); 22 | 23 | getSupportActionBar().setDisplayHomeAsUpEnabled(true); 24 | } 25 | 26 | @Override 27 | public void onBackPressed() { 28 | this.finish(); 29 | Intent i = new Intent(getBaseContext(), BrowserActivity.class); 30 | i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 31 | startActivity(i); 32 | } 33 | 34 | void proxyRestart() { 35 | restart(); 36 | } 37 | 38 | @Override 39 | public boolean onOptionsItemSelected(MenuItem menu) { 40 | switch (menu.getItemId()) { 41 | 42 | case android.R.id.home: 43 | this.finish(); 44 | Intent i = new Intent(getBaseContext(), BrowserActivity.class); 45 | i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 46 | startActivity(i); 47 | return true; 48 | } 49 | return false; 50 | } 51 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/settings/SettingsFragment.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.settings; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.preference.ListPreference; 6 | import android.preference.Preference; 7 | import android.preference.PreferenceFragment; 8 | 9 | import com.dnielfe.manager.R; 10 | 11 | public final class SettingsFragment extends PreferenceFragment { 12 | 13 | private static final String[] THEMES_VALUES = new String[]{ 14 | Integer.toString(R.style.ThemeLight), 15 | Integer.toString(R.style.ThemeDark)}; 16 | 17 | @Override 18 | public void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | this.addPreferencesFromResource(R.xml.preferences); 21 | this.init(); 22 | } 23 | 24 | @Override 25 | public void onAttach(final Activity activity) { 26 | super.onAttach(activity); 27 | if (!(activity instanceof SettingsActivity)) { 28 | throw new RuntimeException( 29 | "Should be attached only to SettingsActivity"); 30 | } 31 | } 32 | 33 | private void init() { 34 | // final SettingsActivity parent = (SettingsActivity) getActivity(); 35 | final ListPreference theme = (ListPreference) findPreference("preference_theme"); 36 | theme.setEntryValues(THEMES_VALUES); 37 | theme.setValue(String.valueOf(Settings.mTheme)); 38 | theme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 39 | @Override 40 | public boolean onPreferenceChange(Preference preference, 41 | Object newValue) { 42 | final int chosenTheme = Integer.parseInt((String) newValue); 43 | if (chosenTheme != Settings.mTheme) { 44 | Settings.mTheme = chosenTheme; 45 | ((SettingsActivity) getActivity()).proxyRestart(); 46 | return true; 47 | } 48 | return false; 49 | } 50 | }); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/tasks/DeleteTask.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.tasks; 2 | 3 | import android.app.Activity; 4 | import android.app.ProgressDialog; 5 | import android.content.DialogInterface; 6 | import android.media.MediaScannerConnection; 7 | import android.os.AsyncTask; 8 | import android.widget.Toast; 9 | 10 | import com.dnielfe.manager.R; 11 | import com.dnielfe.manager.utils.SimpleUtils; 12 | 13 | import java.lang.ref.WeakReference; 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | 17 | public final class DeleteTask extends AsyncTask> { 18 | 19 | private final WeakReference activity; 20 | 21 | private ProgressDialog dialog; 22 | 23 | public DeleteTask(final Activity activity) { 24 | this.activity = new WeakReference<>(activity); 25 | } 26 | 27 | @Override 28 | protected void onPreExecute() { 29 | final Activity activity = this.activity.get(); 30 | 31 | if (activity != null) { 32 | this.dialog = new ProgressDialog(activity); 33 | this.dialog.setMessage(activity.getString(R.string.deleting)); 34 | this.dialog.setCancelable(true); 35 | this.dialog 36 | .setOnCancelListener(new DialogInterface.OnCancelListener() { 37 | @Override 38 | public void onCancel(DialogInterface dialog) { 39 | cancel(false); 40 | } 41 | }); 42 | if (!activity.isFinishing()) { 43 | this.dialog.show(); 44 | } 45 | } 46 | } 47 | 48 | @Override 49 | protected List doInBackground(String... files) { 50 | final Activity activity = this.activity.get(); 51 | final List failed = new ArrayList<>(); 52 | 53 | for (String str : files) { 54 | SimpleUtils.deleteTarget(str); 55 | } 56 | 57 | MediaScannerConnection.scanFile(activity, files, null, null); 58 | return failed; 59 | } 60 | 61 | @Override 62 | protected void onPostExecute(final List failed) { 63 | super.onPostExecute(failed); 64 | this.finish(failed); 65 | } 66 | 67 | @Override 68 | protected void onCancelled(final List failed) { 69 | super.onCancelled(failed); 70 | this.finish(failed); 71 | } 72 | 73 | private void finish(final List failed) { 74 | if (this.dialog != null) { 75 | this.dialog.dismiss(); 76 | } 77 | 78 | final Activity activity = this.activity.get(); 79 | 80 | if (activity != null && !failed.isEmpty()) { 81 | Toast.makeText(activity, activity.getString(R.string.cantopenfile), 82 | Toast.LENGTH_SHORT).show(); 83 | if (!activity.isFinishing()) { 84 | dialog.show(); 85 | } 86 | } else { 87 | Toast.makeText(activity, 88 | activity.getString(R.string.deletesuccess), 89 | Toast.LENGTH_SHORT).show(); 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/tasks/ExtractionTask.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.tasks; 2 | 3 | import android.app.Activity; 4 | import android.app.ProgressDialog; 5 | import android.content.DialogInterface; 6 | import android.os.AsyncTask; 7 | import android.widget.Toast; 8 | 9 | import com.dnielfe.manager.R; 10 | import com.dnielfe.manager.utils.SimpleUtils; 11 | import com.dnielfe.manager.utils.ZipUtils; 12 | 13 | import java.io.File; 14 | import java.lang.ref.WeakReference; 15 | import java.util.ArrayList; 16 | import java.util.Arrays; 17 | import java.util.List; 18 | 19 | public final class ExtractionTask extends AsyncTask> { 20 | 21 | private final WeakReference activity; 22 | private ProgressDialog dialog; 23 | 24 | public ExtractionTask(final Activity activity) { 25 | this.activity = new WeakReference<>(activity); 26 | } 27 | 28 | @Override 29 | protected void onPreExecute() { 30 | final Activity activity = this.activity.get(); 31 | 32 | if (activity != null) { 33 | this.dialog = new ProgressDialog(activity); 34 | this.dialog.setMessage(activity.getString(R.string.unzipping)); 35 | this.dialog.setCancelable(true); 36 | this.dialog 37 | .setOnCancelListener(new DialogInterface.OnCancelListener() { 38 | @Override 39 | public void onCancel(DialogInterface dialog) { 40 | cancel(false); 41 | } 42 | }); 43 | if (!activity.isFinishing()) { 44 | this.dialog.show(); 45 | } 46 | } 47 | } 48 | 49 | @Override 50 | protected List doInBackground(File... files) { 51 | final Activity activity = this.activity.get(); 52 | final List failed = new ArrayList<>(); 53 | final String ext = SimpleUtils.getExtension(files[0].getName()); 54 | 55 | try { 56 | if (ext.equals("zip")) { 57 | ZipUtils.unpackZip(files[0], files[1]); 58 | } 59 | } catch (Exception e) { 60 | failed.add(Arrays.toString(files)); 61 | } 62 | 63 | SimpleUtils.requestMediaScanner(activity, files[1].listFiles()); 64 | return failed; 65 | } 66 | 67 | @Override 68 | protected void onPostExecute(final List failed) { 69 | super.onPostExecute(failed); 70 | this.finish(failed); 71 | } 72 | 73 | @Override 74 | protected void onCancelled(final List failed) { 75 | super.onCancelled(failed); 76 | this.finish(failed); 77 | } 78 | 79 | private void finish(final List failed) { 80 | if (this.dialog != null) { 81 | this.dialog.dismiss(); 82 | } 83 | 84 | final Activity activity = this.activity.get(); 85 | 86 | if (failed.isEmpty()) 87 | Toast.makeText(activity, activity.getString(R.string.extractionsuccess), 88 | Toast.LENGTH_SHORT).show(); 89 | 90 | if (activity != null && !failed.isEmpty()) { 91 | Toast.makeText(activity, activity.getString(R.string.cantopenfile), 92 | Toast.LENGTH_SHORT).show(); 93 | if (!activity.isFinishing()) { 94 | dialog.show(); 95 | } 96 | } 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/tasks/GroupOwnerTask.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.tasks; 2 | 3 | import android.content.Context; 4 | import android.os.AsyncTask; 5 | import android.widget.Toast; 6 | 7 | import com.dnielfe.manager.R; 8 | import com.dnielfe.manager.utils.RootCommands; 9 | 10 | import java.io.File; 11 | 12 | public class GroupOwnerTask extends AsyncTask { 13 | 14 | private final Context context; 15 | private final String group, owner; 16 | 17 | public GroupOwnerTask(Context context, String group1, String owner1) { 18 | this.context = context; 19 | this.group = group1; 20 | this.owner = owner1; 21 | } 22 | 23 | @Override 24 | protected Boolean doInBackground(final File... params) { 25 | return RootCommands.changeGroupOwner((params[0]), owner, group); 26 | } 27 | 28 | @Override 29 | protected void onPostExecute(Boolean result) { 30 | super.onPostExecute(result); 31 | this.finish(result); 32 | } 33 | 34 | @Override 35 | protected void onCancelled(Boolean result) { 36 | super.onCancelled(result); 37 | this.finish(result); 38 | } 39 | 40 | private void finish(Boolean result) { 41 | if (result) 42 | Toast.makeText(this.context, 43 | this.context.getString(R.string.permissionschanged), 44 | Toast.LENGTH_SHORT).show(); 45 | } 46 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/tasks/PasteTask.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.tasks; 2 | 3 | import android.app.Activity; 4 | import android.app.ProgressDialog; 5 | import android.content.DialogInterface; 6 | import android.os.AsyncTask; 7 | import android.widget.Toast; 8 | 9 | import com.dnielfe.manager.R; 10 | import com.dnielfe.manager.utils.ClipBoard; 11 | import com.dnielfe.manager.utils.SimpleUtils; 12 | 13 | import java.io.File; 14 | import java.lang.ref.WeakReference; 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | 18 | public final class PasteTask extends AsyncTask> { 19 | 20 | private final WeakReference activity; 21 | 22 | private ProgressDialog dialog; 23 | 24 | private final String location; 25 | 26 | private boolean success = false; 27 | 28 | public PasteTask(final Activity activity, String currentDir) { 29 | this.activity = new WeakReference<>(activity); 30 | this.location = currentDir; 31 | } 32 | 33 | @Override 34 | protected void onPreExecute() { 35 | final Activity activity = this.activity.get(); 36 | 37 | if (activity != null) { 38 | this.dialog = new ProgressDialog(activity); 39 | 40 | if (ClipBoard.isMove()) 41 | this.dialog.setMessage(activity.getString(R.string.moving)); 42 | else 43 | this.dialog.setMessage(activity.getString(R.string.copying)); 44 | 45 | this.dialog.setCancelable(true); 46 | this.dialog 47 | .setOnCancelListener(new DialogInterface.OnCancelListener() { 48 | @Override 49 | public void onCancel(DialogInterface dialog) { 50 | cancel(false); 51 | } 52 | }); 53 | if (!activity.isFinishing()) { 54 | this.dialog.show(); 55 | } 56 | } 57 | } 58 | 59 | @Override 60 | protected List doInBackground(String... content) { 61 | final List failed = new ArrayList<>(); 62 | final Activity activity = this.activity.get(); 63 | ClipBoard.lock(); 64 | 65 | for (String target : content) { 66 | if (ClipBoard.isMove()) { 67 | SimpleUtils.moveToDirectory(target, location); 68 | success = true; 69 | } else { 70 | SimpleUtils.copyToDirectory(target, location); 71 | success = true; 72 | } 73 | } 74 | 75 | if (new File(location).canRead()) 76 | SimpleUtils.requestMediaScanner(activity, new File(location).listFiles()); 77 | return failed; 78 | } 79 | 80 | @Override 81 | protected void onPostExecute(final List failed) { 82 | super.onPostExecute(failed); 83 | this.finish(failed); 84 | } 85 | 86 | @Override 87 | protected void onCancelled(final List failed) { 88 | super.onCancelled(failed); 89 | this.finish(failed); 90 | } 91 | 92 | private void finish(final List failed) { 93 | if (this.dialog != null) { 94 | this.dialog.dismiss(); 95 | } 96 | 97 | final Activity activity = this.activity.get(); 98 | 99 | if (ClipBoard.isMove()) { 100 | if (success) 101 | Toast.makeText(activity, 102 | activity.getString(R.string.movesuccsess), 103 | Toast.LENGTH_SHORT).show(); 104 | else 105 | Toast.makeText(activity, activity.getString(R.string.movefail), 106 | Toast.LENGTH_SHORT).show(); 107 | } else { 108 | if (success) 109 | Toast.makeText(activity, 110 | activity.getString(R.string.copysuccsess), 111 | Toast.LENGTH_SHORT).show(); 112 | else 113 | Toast.makeText(activity, activity.getString(R.string.copyfail), 114 | Toast.LENGTH_SHORT).show(); 115 | } 116 | 117 | ClipBoard.unlock(); 118 | ClipBoard.clear(); 119 | activity.invalidateOptionsMenu(); 120 | 121 | if (!failed.isEmpty()) { 122 | Toast.makeText(activity, activity.getString(R.string.cantopenfile), 123 | Toast.LENGTH_SHORT).show(); 124 | if (!activity.isFinishing()) { 125 | dialog.show(); 126 | } 127 | } 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/tasks/PasteTaskExecutor.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.tasks; 2 | 3 | import android.app.Activity; 4 | import android.app.Dialog; 5 | import android.view.View; 6 | import android.view.View.OnClickListener; 7 | 8 | import com.dnielfe.manager.R; 9 | import com.dnielfe.manager.dialogs.FileExistsDialog; 10 | import com.dnielfe.manager.utils.ClipBoard; 11 | 12 | import java.io.File; 13 | import java.lang.ref.WeakReference; 14 | import java.util.HashMap; 15 | import java.util.LinkedList; 16 | 17 | public final class PasteTaskExecutor implements OnClickListener { 18 | 19 | private final WeakReference mActivityReference; 20 | 21 | private final String mLocation; 22 | private final LinkedList mToProcess; 23 | private final HashMap mExisting; 24 | 25 | private String current; 26 | 27 | public PasteTaskExecutor(final Activity activity, final String location) { 28 | this.mActivityReference = new WeakReference<>(activity); 29 | this.mLocation = location; 30 | this.mToProcess = new LinkedList<>(); 31 | this.mExisting = new HashMap<>(); 32 | } 33 | 34 | public void start() { 35 | final String[] contents = ClipBoard.getClipBoardContents(); 36 | if (contents == null) { 37 | return; 38 | } 39 | 40 | for (final String ab : contents) { 41 | File file = new File(ab); 42 | 43 | if (file.exists()) { 44 | final File testTarget = new File(mLocation, file.getName()); 45 | 46 | if (testTarget.exists()) { 47 | mExisting.put(testTarget.getPath(), file.getPath()); 48 | } else { 49 | mToProcess.add(file.getPath()); 50 | } 51 | } 52 | } 53 | 54 | next(); 55 | } 56 | 57 | @Override 58 | public void onClick(View v) { 59 | switch (v.getId()) { 60 | case android.R.id.button1: 61 | // replace 62 | mToProcess.add(current); 63 | break; 64 | 65 | case android.R.id.button2: 66 | // replace all; 67 | mToProcess.add(current); 68 | for (String f : mExisting.keySet()) { 69 | mToProcess.add(mExisting.get(f)); 70 | } 71 | mExisting.clear(); 72 | break; 73 | 74 | case R.id.button4: 75 | // skip all 76 | mExisting.clear(); 77 | break; 78 | 79 | case R.id.button5: 80 | // abort 81 | mExisting.clear(); 82 | mToProcess.clear(); 83 | return; 84 | } 85 | 86 | next(); 87 | } 88 | 89 | private void next() { 90 | final Activity a = this.mActivityReference.get(); 91 | if (a != null) { 92 | if (mExisting.isEmpty()) { 93 | if (mToProcess.isEmpty()) { 94 | ClipBoard.clear(); 95 | } else { 96 | String[] array = new String[mToProcess.size()]; 97 | for (int i = 0; i < mToProcess.size(); i++) { 98 | array[i] = mToProcess.get(i); 99 | } 100 | 101 | mToProcess.toArray(array); 102 | 103 | final PasteTask task = new PasteTask(a, mLocation); 104 | task.execute(array); 105 | } 106 | } else { 107 | final String key = mExisting.keySet().iterator().next(); 108 | this.current = mExisting.get(key); 109 | mExisting.remove(key); 110 | 111 | final Dialog dialog = new FileExistsDialog(a, current, key, 112 | this, this, this, this, this); 113 | if (!a.isFinishing()) { 114 | dialog.show(); 115 | } 116 | } 117 | 118 | a.invalidateOptionsMenu(); 119 | } 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/tasks/RenameTask.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.tasks; 2 | 3 | import android.app.Activity; 4 | import android.app.ProgressDialog; 5 | import android.content.DialogInterface; 6 | import android.os.AsyncTask; 7 | import android.widget.Toast; 8 | 9 | import com.dnielfe.manager.R; 10 | import com.dnielfe.manager.adapters.BrowserTabsAdapter; 11 | import com.dnielfe.manager.settings.Settings; 12 | import com.dnielfe.manager.utils.RootCommands; 13 | import com.dnielfe.manager.utils.SimpleUtils; 14 | 15 | import java.lang.ref.WeakReference; 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | public final class RenameTask extends AsyncTask> { 20 | 21 | private final WeakReference activity; 22 | 23 | private ProgressDialog dialog; 24 | 25 | private boolean succes = false; 26 | 27 | public RenameTask(final Activity activity) { 28 | this.activity = new WeakReference<>(activity); 29 | } 30 | 31 | @Override 32 | protected void onPreExecute() { 33 | final Activity activity = this.activity.get(); 34 | 35 | if (activity != null) { 36 | this.dialog = new ProgressDialog(activity); 37 | this.dialog.setMessage(activity.getString(R.string.rename)); 38 | this.dialog.setCancelable(true); 39 | this.dialog 40 | .setOnCancelListener(new DialogInterface.OnCancelListener() { 41 | @Override 42 | public void onCancel(DialogInterface dialog) { 43 | cancel(false); 44 | } 45 | }); 46 | if (!activity.isFinishing()) { 47 | this.dialog.show(); 48 | } 49 | } 50 | } 51 | 52 | @Override 53 | protected List doInBackground(String... files) { 54 | final List failed = new ArrayList<>(); 55 | String path = BrowserTabsAdapter.getCurrentBrowserFragment().mCurrentPath; 56 | 57 | try { 58 | if (SimpleUtils.renameTarget(path + "/" + files[0], files[1])) { 59 | succes = true; 60 | } else { 61 | if (Settings.rootAccess()) { 62 | RootCommands.renameRootTarget(path, files[0], files[1]); 63 | succes = true; 64 | } 65 | } 66 | } catch (Exception e) { 67 | failed.add(files[1]); 68 | succes = false; 69 | } 70 | return failed; 71 | } 72 | 73 | @Override 74 | protected void onPostExecute(final List failed) { 75 | super.onPostExecute(failed); 76 | this.finish(failed); 77 | } 78 | 79 | @Override 80 | protected void onCancelled(final List failed) { 81 | super.onCancelled(failed); 82 | this.finish(failed); 83 | } 84 | 85 | private void finish(final List failed) { 86 | if (this.dialog != null) { 87 | this.dialog.dismiss(); 88 | } 89 | 90 | final Activity activity = this.activity.get(); 91 | 92 | if (succes) 93 | Toast.makeText(activity, 94 | activity.getString(R.string.filewasrenamed), 95 | Toast.LENGTH_LONG).show(); 96 | 97 | if (activity != null && !failed.isEmpty()) { 98 | Toast.makeText(activity, activity.getString(R.string.cantopenfile), 99 | Toast.LENGTH_SHORT).show(); 100 | if (!activity.isFinishing()) { 101 | dialog.show(); 102 | } 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/tasks/ZipTask.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.tasks; 2 | 3 | import android.app.Activity; 4 | import android.app.ProgressDialog; 5 | import android.content.DialogInterface; 6 | import android.os.AsyncTask; 7 | import android.widget.Toast; 8 | 9 | import com.dnielfe.manager.R; 10 | import com.dnielfe.manager.utils.ZipUtils; 11 | 12 | import java.lang.ref.WeakReference; 13 | import java.util.ArrayList; 14 | import java.util.Arrays; 15 | import java.util.List; 16 | 17 | public final class ZipTask extends AsyncTask> { 18 | 19 | private final WeakReference activity; 20 | private ProgressDialog dialog; 21 | private final String zipname; 22 | 23 | public ZipTask(final Activity activity, String name1) { 24 | this.activity = new WeakReference<>(activity); 25 | this.zipname = name1; 26 | } 27 | 28 | @Override 29 | protected void onPreExecute() { 30 | final Activity activity = this.activity.get(); 31 | 32 | if (activity != null) { 33 | this.dialog = new ProgressDialog(activity); 34 | this.dialog.setMessage(activity.getString(R.string.packing)); 35 | this.dialog.setCancelable(true); 36 | this.dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 37 | @Override 38 | public void onCancel(DialogInterface dialog) { 39 | cancel(false); 40 | } 41 | }); 42 | if (!activity.isFinishing()) { 43 | this.dialog.show(); 44 | } 45 | } 46 | } 47 | 48 | @Override 49 | protected List doInBackground(String... files) { 50 | final List failed = new ArrayList<>(); 51 | 52 | try { 53 | ZipUtils.createZip(files, zipname); 54 | } catch (Exception e) { 55 | failed.add(Arrays.toString(files)); 56 | } 57 | return failed; 58 | } 59 | 60 | @Override 61 | protected void onPostExecute(final List failed) { 62 | super.onPostExecute(failed); 63 | this.finish(failed); 64 | } 65 | 66 | @Override 67 | protected void onCancelled(final List failed) { 68 | super.onCancelled(failed); 69 | this.finish(failed); 70 | } 71 | 72 | private void finish(final List failed) { 73 | if (this.dialog != null) { 74 | this.dialog.dismiss(); 75 | } 76 | 77 | final Activity activity = this.activity.get(); 78 | if (activity != null && !failed.isEmpty()) { 79 | Toast.makeText(activity, activity.getString(R.string.cantopenfile), 80 | Toast.LENGTH_SHORT).show(); 81 | if (!activity.isFinishing()) { 82 | dialog.show(); 83 | } 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/ui/NavigationView.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.ui; 2 | 3 | import android.app.Activity; 4 | import android.view.Gravity; 5 | import android.view.View; 6 | import android.view.View.OnClickListener; 7 | import android.widget.FrameLayout; 8 | import android.widget.HorizontalScrollView; 9 | import android.widget.LinearLayout; 10 | import android.widget.TextView; 11 | 12 | import com.dnielfe.manager.R; 13 | import com.dnielfe.manager.utils.SimpleUtils; 14 | 15 | import java.io.File; 16 | import java.util.HashSet; 17 | import java.util.Set; 18 | 19 | public class NavigationView { 20 | 21 | public final Set listeners; 22 | private final Activity mActivity; 23 | private final int text_size = 16; 24 | private final int WRAP_CONTENT = LinearLayout.LayoutParams.WRAP_CONTENT; 25 | private final int MATCH_PARENT = FrameLayout.LayoutParams.MATCH_PARENT; 26 | 27 | public interface OnNavigateListener { 28 | void onNavigate(String path); 29 | } 30 | 31 | public NavigationView(Activity activity) { 32 | this.mActivity = activity; 33 | this.listeners = new HashSet<>(); 34 | } 35 | 36 | public void setDirectoryButtons(String path) { 37 | File currentDirectory = new File(path); 38 | String dir = ""; 39 | 40 | HorizontalScrollView scrolltext = (HorizontalScrollView) mActivity 41 | .findViewById(R.id.scroll_text); 42 | LinearLayout mView = (LinearLayout) mActivity.findViewById(R.id.directory_buttons); 43 | mView.removeAllViews(); 44 | 45 | String[] parts = currentDirectory.getAbsolutePath().split("/"); 46 | 47 | // Add home view separately 48 | TextView t0 = new TextView(mActivity, null, 49 | android.R.attr.actionButtonStyle); 50 | t0.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, 51 | MATCH_PARENT, Gravity.CENTER_VERTICAL)); 52 | t0.setText("/"); 53 | t0.setTextSize(text_size); 54 | t0.setTag(dir); 55 | t0.setOnClickListener(new OnClickListener() { 56 | @Override 57 | public void onClick(View view) { 58 | for (final OnNavigateListener listener : listeners) { 59 | listener.onNavigate("/"); 60 | } 61 | } 62 | }); 63 | 64 | mView.addView(t0); 65 | 66 | // Add other buttons 67 | for (int i = 1; i < parts.length; i++) { 68 | dir += "/" + parts[i]; 69 | 70 | // add a LinearLayout as a divider 71 | FrameLayout fv1 = new FrameLayout(mActivity); 72 | LinearLayout divider = (LinearLayout) mActivity.getLayoutInflater() 73 | .inflate(R.layout.item_navigation_divider, null); 74 | fv1.addView(divider); 75 | fv1.setLayoutParams(new FrameLayout.LayoutParams(WRAP_CONTENT, 76 | WRAP_CONTENT, Gravity.CENTER_VERTICAL)); 77 | 78 | // add clickable TextView 79 | TextView t2 = new TextView(mActivity, null, 80 | android.R.attr.actionButtonStyle); 81 | t2.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, 82 | MATCH_PARENT, Gravity.CENTER_VERTICAL)); 83 | t2.setText(parts[i]); 84 | t2.setTextSize(text_size); 85 | t2.setTag(dir); 86 | t2.setOnClickListener(new OnClickListener() { 87 | @Override 88 | public void onClick(View view) { 89 | String dir1 = (String) view.getTag(); 90 | for (final OnNavigateListener listener : listeners) { 91 | listener.onNavigate(dir1); 92 | } 93 | } 94 | }); 95 | 96 | t2.setOnLongClickListener(new View.OnLongClickListener() { 97 | public boolean onLongClick(View view) { 98 | String dir1 = (String) view.getTag(); 99 | SimpleUtils.savetoClipBoard(mActivity, dir1); 100 | return true; 101 | } 102 | }); 103 | 104 | mView.addView(fv1); 105 | mView.addView(t2); 106 | scrolltext.postDelayed(new Runnable() { 107 | @Override 108 | public void run() { 109 | HorizontalScrollView hv = (HorizontalScrollView) mActivity 110 | .findViewById(R.id.scroll_text); 111 | hv.fullScroll(HorizontalScrollView.FOCUS_RIGHT); 112 | } 113 | }, 100L); 114 | } 115 | } 116 | 117 | public void addonNavigateListener(final OnNavigateListener listener) { 118 | this.listeners.add(listener); 119 | } 120 | 121 | public void removeOnNavigateListener(final OnNavigateListener listener) { 122 | this.listeners.remove(listener); 123 | } 124 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/utils/Bookmark.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.utils; 2 | 3 | public class Bookmark { 4 | 5 | private int id; 6 | private String name; 7 | private String path; 8 | 9 | public Bookmark() { 10 | } 11 | 12 | public Bookmark(String title, String author) { 13 | super(); 14 | this.name = title; 15 | this.path = author; 16 | } 17 | 18 | public int getId() { 19 | return id; 20 | } 21 | 22 | public void setId(int id) { 23 | this.id = id; 24 | } 25 | 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | public void setName(String title) { 31 | this.name = title; 32 | } 33 | 34 | public String getPath() { 35 | return path; 36 | } 37 | 38 | public void setPath(String author) { 39 | this.path = author; 40 | } 41 | 42 | @Override 43 | public String toString() { 44 | return "Bookmark [id=" + id + ", name=" + name + ", path=" + path + "]"; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/utils/BookmarksHelper.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.utils; 2 | 3 | import android.content.ContentValues; 4 | import android.content.Context; 5 | import android.database.Cursor; 6 | import android.database.sqlite.SQLiteDatabase; 7 | import android.database.sqlite.SQLiteOpenHelper; 8 | 9 | import java.util.LinkedList; 10 | import java.util.List; 11 | 12 | public class BookmarksHelper extends SQLiteOpenHelper { 13 | 14 | // Database Version 15 | private static final int DATABASE_VERSION = 1; 16 | // Database Name 17 | private static final String DATABASE_NAME = "BookmarksDB"; 18 | // Books table name 19 | private static final String TABLE_BOOKS = "bookmarks"; 20 | // Books Table Columns names 21 | private static final String KEY_ID = "id"; 22 | private static final String KEY_NAME = "name"; 23 | private static final String KEY_PATH = "path"; 24 | 25 | public BookmarksHelper(Context context) { 26 | super(context, DATABASE_NAME, null, DATABASE_VERSION); 27 | } 28 | 29 | @Override 30 | public void onCreate(SQLiteDatabase db) { 31 | // SQL statement to create book table 32 | String CREATE_BOOK_TABLE = "CREATE TABLE " + TABLE_BOOKS + " (id " + 33 | "INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, path Text)"; 34 | 35 | // create books table 36 | db.execSQL(CREATE_BOOK_TABLE); 37 | 38 | /* 39 | create bookmark at start 40 | ContentValues cv = new ContentValues(); 41 | File file = Environment.getExternalStorageDirectory(); 42 | cv.put(KEY_NAME, "SDCard"); 43 | cv.put(KEY_PATH, file.getPath()); 44 | db.insert(TABLE_BOOKS, null, cv); 45 | */ 46 | } 47 | 48 | @Override 49 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 50 | db.execSQL("DROP TABLE IF EXISTS bookmarks"); 51 | this.onCreate(db); 52 | } 53 | 54 | public List getAllBooks() { 55 | List books = new LinkedList<>(); 56 | 57 | String query = "SELECT * FROM " + TABLE_BOOKS; 58 | 59 | SQLiteDatabase db = getWritableDatabase(); 60 | Cursor cursor = db.rawQuery(query, null); 61 | 62 | // go over each row, build book and add it to list 63 | Bookmark book; 64 | if (cursor.moveToFirst()) { 65 | do { 66 | book = new Bookmark(); 67 | book.setId(Integer.parseInt(cursor.getString(0))); 68 | book.setName(cursor.getString(1)); 69 | book.setPath(cursor.getString(2)); 70 | books.add(book); 71 | } while (cursor.moveToNext()); 72 | } 73 | 74 | return books; 75 | } 76 | 77 | public void addBookmark(Bookmark book) { 78 | SQLiteDatabase db = getWritableDatabase(); 79 | 80 | ContentValues values = new ContentValues(); 81 | values.put(KEY_NAME, book.getName()); 82 | values.put(KEY_PATH, book.getPath()); 83 | 84 | db.insert(TABLE_BOOKS, null, values); 85 | db.close(); 86 | } 87 | 88 | public void deleteBook(Bookmark book) { 89 | SQLiteDatabase db = getWritableDatabase(); 90 | db.delete(TABLE_BOOKS, KEY_ID + " = ?", new String[]{String.valueOf(book.getId())}); 91 | db.close(); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/utils/ClipBoard.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.utils; 2 | 3 | /** 4 | * Holds references to copied or moved to clipboard files 5 | */ 6 | public final class ClipBoard { 7 | 8 | private static final Object LOCK = new Object(); 9 | 10 | /** 11 | * Files in clip board 12 | */ 13 | private static String[] clipBoard; 14 | 15 | /** 16 | * True if move, false if cutCopy 17 | */ 18 | private static boolean isMove; 19 | 20 | /** 21 | * If true, clipBoard can't be modified 22 | */ 23 | private static volatile boolean isLocked; 24 | 25 | private ClipBoard() { 26 | } 27 | 28 | public static synchronized void cutCopy(String[] files) { 29 | synchronized (LOCK) { 30 | if (!isLocked) { 31 | isMove = false; 32 | clipBoard = files; 33 | } 34 | } 35 | } 36 | 37 | public static synchronized void cutMove(String[] files) { 38 | synchronized (LOCK) { 39 | if (!isLocked) { 40 | isMove = true; 41 | clipBoard = files; 42 | } 43 | } 44 | } 45 | 46 | public static void lock() { 47 | synchronized (LOCK) { 48 | isLocked = true; 49 | } 50 | } 51 | 52 | public static void unlock() { 53 | synchronized (LOCK) { 54 | isLocked = false; 55 | } 56 | } 57 | 58 | public static String[] getClipBoardContents() { 59 | synchronized (LOCK) { 60 | return clipBoard; 61 | } 62 | } 63 | 64 | public static boolean isEmpty() { 65 | synchronized (LOCK) { 66 | return clipBoard == null; 67 | } 68 | } 69 | 70 | public static boolean isMove() { 71 | synchronized (LOCK) { 72 | return isMove; 73 | } 74 | } 75 | 76 | public static void clear() { 77 | synchronized (LOCK) { 78 | if (!isLocked) { 79 | clipBoard = null; 80 | isMove = false; 81 | } 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/utils/Permissions.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.utils; 2 | 3 | import java.io.File; 4 | import java.io.Serializable; 5 | 6 | public final class Permissions implements Serializable { 7 | 8 | private static final long serialVersionUID = 2682238088276963741L; 9 | 10 | public final boolean ur; 11 | public final boolean uw; 12 | public final boolean ux; 13 | 14 | public final boolean gr; 15 | public final boolean gw; 16 | public final boolean gx; 17 | 18 | public final boolean or; 19 | public final boolean ow; 20 | public final boolean ox; 21 | 22 | public Permissions(String line) { 23 | if (line.length() != 10) { 24 | throw new IllegalArgumentException("Bad permission line"); 25 | } 26 | 27 | this.ur = line.charAt(1) == 'r'; 28 | this.uw = line.charAt(2) == 'w'; 29 | this.ux = line.charAt(3) == 'x'; 30 | 31 | this.gr = line.charAt(4) == 'r'; 32 | this.gw = line.charAt(5) == 'w'; 33 | this.gx = line.charAt(6) == 'x'; 34 | 35 | this.or = line.charAt(7) == 'r'; 36 | this.ow = line.charAt(8) == 'w'; 37 | this.ox = line.charAt(9) == 'x'; 38 | } 39 | 40 | public Permissions(boolean ur, boolean uw, boolean ux, boolean gr, boolean gw, 41 | boolean gx, boolean or, boolean ow, boolean ox) { 42 | this.ur = ur; 43 | this.uw = uw; 44 | this.ux = ux; 45 | 46 | this.gr = gr; 47 | this.gw = gw; 48 | this.gx = gx; 49 | 50 | this.or = or; 51 | this.ow = ow; 52 | this.ox = ox; 53 | } 54 | 55 | public static String toOctalPermission(final Permissions p) { 56 | byte user = 0; 57 | byte group = 0; 58 | byte other = 0; 59 | 60 | if (p.ur) { 61 | user += 4; 62 | } 63 | if (p.uw) { 64 | user += 2; 65 | } 66 | if (p.ux) { 67 | user += 1; 68 | } 69 | 70 | if (p.gr) { 71 | group += 4; 72 | } 73 | if (p.gw) { 74 | group += 2; 75 | } 76 | if (p.gx) { 77 | group += 1; 78 | } 79 | 80 | if (p.or) { 81 | other += 4; 82 | } 83 | if (p.ow) { 84 | other += 2; 85 | } 86 | if (p.ox) { 87 | other += 1; 88 | } 89 | 90 | return String.valueOf(user) + group + other; 91 | } 92 | 93 | // use this as alternative if no root is available 94 | public static String getBasicPermission(File file) { 95 | String per = ""; 96 | 97 | per += file.isDirectory() ? "d" : "-"; 98 | per += file.canRead() ? "r" : "-"; 99 | per += file.canWrite() ? "w" : "-"; 100 | per += file.canExecute() ? "x" : "-"; 101 | 102 | return per; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/utils/StatFsCompat.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.utils; 2 | 3 | import android.annotation.SuppressLint; 4 | import android.os.Build; 5 | import android.os.StatFs; 6 | 7 | /** 8 | * Backward compatible version of {@link android.os.StatFs} 9 | */ 10 | public final class StatFsCompat { 11 | 12 | /** 13 | * StatFs instance 14 | */ 15 | private final StatFs mStatFs; 16 | 17 | /** 18 | * Construct a new StatFs for looking at the stats of the filesystem at 19 | * {@code path}. Upon construction, the stat of the file system will be 20 | * performed, and the values retrieved available from the methods on this 21 | * class. 22 | * 23 | * @param path path in the desired file system to stat. 24 | */ 25 | public StatFsCompat(final String path) { 26 | this.mStatFs = new StatFs(path); 27 | } 28 | 29 | /** 30 | * The number of blocks that are free on the file system and available to 31 | * applications. This corresponds to the Unix {@code statvfs.f_bavail} 32 | * field. 33 | */ 34 | @SuppressLint("NewApi") 35 | @SuppressWarnings("deprecation") 36 | public long getAvailableBlocksLong() { 37 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 38 | return mStatFs.getAvailableBlocksLong(); 39 | } else { 40 | return mStatFs.getAvailableBlocks(); 41 | } 42 | } 43 | 44 | /** 45 | * The total number of blocks on the file system. This corresponds to the 46 | * Unix {@code statvfs.f_blocks} field. 47 | */ 48 | @SuppressLint("NewApi") 49 | @SuppressWarnings("deprecation") 50 | public long getBlockCountLong() { 51 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 52 | return mStatFs.getBlockCountLong(); 53 | } else { 54 | return mStatFs.getBlockCount(); 55 | } 56 | } 57 | 58 | /** 59 | * The size, in bytes, of a block on the file system. This corresponds to 60 | * the Unix {@code statvfs.f_bsize} field. 61 | */ 62 | @SuppressLint("NewApi") 63 | @SuppressWarnings("deprecation") 64 | public long getBlockSizeLong() { 65 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 66 | return mStatFs.getBlockSizeLong(); 67 | } else { 68 | return mStatFs.getBlockSize(); 69 | } 70 | } 71 | 72 | /** 73 | * The total number of blocks that are free on the file system, including 74 | * reserved blocks (that are not available to normal applications). This 75 | * corresponds to the Unix {@code statvfs.f_bfree} field. Most applications 76 | * will want to use {@link #getAvailableBlocksLong()} instead. 77 | */ 78 | @SuppressLint("NewApi") 79 | @SuppressWarnings("deprecation") 80 | public long getFreeBlocksLong() { 81 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 82 | return mStatFs.getFreeBlocksLong(); 83 | } else { 84 | return mStatFs.getFreeBlocks(); 85 | } 86 | } 87 | 88 | /** 89 | * The number of bytes that are free on the file system and available to 90 | * applications. 91 | */ 92 | @SuppressLint("NewApi") 93 | public long getAvailableBytes() { 94 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 95 | return mStatFs.getAvailableBytes(); 96 | } else { 97 | return getAvailableBlocksLong() * getBlockSizeLong(); 98 | } 99 | } 100 | 101 | /** 102 | * The number of bytes that are free on the file system, including reserved 103 | * blocks (that are not available to normal applications). Most applications 104 | * will want to use {@link #getAvailableBytes()} instead. 105 | */ 106 | @SuppressLint("NewApi") 107 | public long getFreeBytes() { 108 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 109 | return mStatFs.getFreeBytes(); 110 | } else { 111 | return getFreeBlocksLong() * getBlockSizeLong(); 112 | } 113 | } 114 | 115 | /** 116 | * The total number of bytes supported by the file system. 117 | */ 118 | public long getTotalBytes() { 119 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 120 | return mStatFs.getTotalBytes(); 121 | } else { 122 | return getBlockCountLong() * getBlockSizeLong(); 123 | } 124 | } 125 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/mustardlabs/explorer/utils/ZipUtils.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.utils; 2 | 3 | import java.io.BufferedInputStream; 4 | import java.io.BufferedOutputStream; 5 | import java.io.File; 6 | import java.io.FileInputStream; 7 | import java.io.FileOutputStream; 8 | import java.io.IOException; 9 | import java.util.Enumeration; 10 | import java.util.zip.ZipEntry; 11 | import java.util.zip.ZipFile; 12 | import java.util.zip.ZipOutputStream; 13 | 14 | public class ZipUtils { 15 | 16 | private static final int BUFFER = 8192; 17 | 18 | public static void createZip(String[] files, String zipFile) { 19 | try { 20 | FileOutputStream dest = new FileOutputStream(zipFile); 21 | ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream( 22 | dest)); 23 | 24 | for (String s : files) { 25 | File file = new File(s); 26 | 27 | if (file.isDirectory()) { 28 | zipSubFolder(out, file, file.getParent().length()); 29 | } else { 30 | zipFile(out, file); 31 | } 32 | } 33 | 34 | out.close(); 35 | } catch (Exception e) { 36 | e.printStackTrace(); 37 | } 38 | } 39 | 40 | public static void unpackZip(File zipFile, File location) { 41 | try { 42 | // Extract entries while creating required sub-directories 43 | ZipFile zf = new ZipFile(zipFile); 44 | Enumeration e = zf.entries(); 45 | 46 | while (e.hasMoreElements()) { 47 | ZipEntry entry = (ZipEntry) e.nextElement(); 48 | File destinationFilePath = new File(location, entry.getName()); 49 | 50 | // create directories if required. 51 | destinationFilePath.getParentFile().mkdirs(); 52 | 53 | // if the entry is directory, leave it. Otherwise extract it. 54 | if (!entry.isDirectory()) { 55 | // Get the InputStream for current entry of the zip file 56 | // using InputStream getInputStream(Entry entry) method. 57 | BufferedInputStream bis = new BufferedInputStream(zf.getInputStream(entry)); 58 | 59 | int b; 60 | byte buffer[] = new byte[BUFFER]; 61 | 62 | // read the current entry from the zip file, extract it and 63 | // write the extracted file. 64 | FileOutputStream fos = new FileOutputStream(destinationFilePath); 65 | BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER); 66 | 67 | while ((b = bis.read(buffer, 0, 1024)) != -1) { 68 | bos.write(buffer, 0, b); 69 | } 70 | 71 | bos.flush(); 72 | bos.close(); 73 | bis.close(); 74 | } 75 | } 76 | 77 | zf.close(); 78 | } catch (IOException ioe) { 79 | ioe.printStackTrace(); 80 | } 81 | } 82 | 83 | private static void zipSubFolder(ZipOutputStream out, File folder, 84 | int basePathLength) throws IOException { 85 | File[] fileList = folder.listFiles(); 86 | 87 | for (File file : fileList) { 88 | if (file.isDirectory()) { 89 | zipSubFolder(out, file, basePathLength); 90 | } else { 91 | BufferedInputStream origin; 92 | byte data[] = new byte[BUFFER]; 93 | String unmodifiedFilePath = file.getPath(); 94 | String relativePath = unmodifiedFilePath 95 | .substring(basePathLength); 96 | 97 | FileInputStream fi = new FileInputStream(unmodifiedFilePath); 98 | origin = new BufferedInputStream(fi, BUFFER); 99 | ZipEntry entry = new ZipEntry(relativePath); 100 | out.putNextEntry(entry); 101 | int count; 102 | while ((count = origin.read(data, 0, BUFFER)) != -1) { 103 | out.write(data, 0, count); 104 | } 105 | origin.close(); 106 | } 107 | } 108 | } 109 | 110 | private static void zipFile(ZipOutputStream out, File file) 111 | throws IOException { 112 | BufferedInputStream origin; 113 | byte data[] = new byte[BUFFER]; 114 | String str = file.getPath(); 115 | 116 | FileInputStream fi = new FileInputStream(str); 117 | origin = new BufferedInputStream(fi, BUFFER); 118 | ZipEntry entry = new ZipEntry(str.substring(str.lastIndexOf("/") + 1)); 119 | out.putNextEntry(entry); 120 | int count; 121 | while ((count = origin.read(data, 0, BUFFER)) != -1) { 122 | out.write(data, 0, count); 123 | } 124 | origin.close(); 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/actionpaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/actionpaste.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/drawer_shadow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/drawer_shadow.9.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_action_copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_action_copy.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_action_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_action_cut.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_action_delete.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_action_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_action_edit.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_action_info.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_action_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_action_remove.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_action_search.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_action_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_action_share.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_ic_action_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_ic_action_new.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_ic_action_select_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_ic_action_select_all.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_ic_bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_ic_bookmark.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_dark_ic_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_dark_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_action_copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_action_copy.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_action_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_action_cut.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_action_delete.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_action_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_action_edit.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_action_info.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_action_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_action_remove.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_action_search.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_action_select_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_action_select_all.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_action_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_action_share.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_ic_action_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_ic_action_new.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_ic_bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_ic_bookmark.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/holo_light_ic_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/holo_light_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_apk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_apk.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_config.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_folder.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_folder_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_folder_empty.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_html.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_music.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_note.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_package.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_pdf.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_pic.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_unknown.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_video.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-hdpi/type_xml.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/actionpaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/actionpaste.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/drawer_shadow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/drawer_shadow.9.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_action_copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_action_copy.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_action_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_action_cut.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_action_delete.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_action_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_action_edit.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_action_info.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_action_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_action_remove.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_action_search.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_action_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_action_share.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_ic_action_select_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_ic_action_select_all.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_ic_bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_ic_bookmark.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_dark_ic_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_dark_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_action_copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_action_copy.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_action_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_action_cut.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_action_delete.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_action_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_action_edit.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_action_info.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_action_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_action_remove.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_action_search.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_action_select_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_action_select_all.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_action_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_action_share.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_ic_action_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_ic_action_new.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_ic_bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_ic_bookmark.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/holo_light_ic_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/holo_light_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/actionpaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/actionpaste.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/drawer_shadow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/drawer_shadow.9.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_action_copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_action_copy.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_action_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_action_cut.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_action_delete.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_action_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_action_edit.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_action_info.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_action_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_action_remove.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_action_search.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_action_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_action_share.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_ic_action_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_ic_action_new.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_ic_action_select_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_ic_action_select_all.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_ic_bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_ic_bookmark.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_dark_ic_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_dark_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_action_copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_action_copy.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_action_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_action_cut.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_action_delete.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_action_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_action_edit.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_action_info.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_action_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_action_remove.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_action_search.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_action_select_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_action_select_all.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_action_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_action_share.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_ic_action_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_ic_action_new.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_ic_bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_ic_bookmark.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/holo_light_ic_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/holo_light_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_apk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_apk.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_config.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_folder.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_folder_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_folder_empty.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_html.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_music.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_note.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_package.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_pdf.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_pic.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_unknown.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_video.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xhdpi/type_xml.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/actionpaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/actionpaste.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/drawer_shadow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/drawer_shadow.9.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_action_copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_action_copy.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_action_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_action_cut.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_action_delete.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_action_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_action_edit.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_action_info.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_action_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_action_remove.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_action_search.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_action_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_action_share.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_ic_action_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_ic_action_new.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_ic_action_select_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_ic_action_select_all.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_dark_ic_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_dark_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_action_copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_action_copy.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_action_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_action_cut.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_action_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_action_delete.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_action_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_action_edit.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_action_info.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_action_remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_action_remove.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_action_search.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_action_select_all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_action_select_all.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_action_share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_action_share.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_ic_action_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_ic_action_new.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/holo_light_ic_storage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/holo_light_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_apk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_apk.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_config.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_folder.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_folder_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_folder_empty.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_html.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_music.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_note.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_package.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_pdf.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_pic.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_unknown.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_video.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxhdpi/type_xml.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Thunderbottom/File-Explorer/b84d623cea9828d15fef5d813bbe62aa499e503d/explorer/src/main/res/drawable-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/main/res/layout/activity_browser.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 13 | 14 | 15 | 16 | 20 | 21 | 28 | 29 | 36 | 37 | 38 | 44 | 45 | 49 | 50 | 51 | 52 | 53 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /explorer/src/main/res/layout/activity_search.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 12 | 13 | 17 | 18 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /explorer/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 14 | -------------------------------------------------------------------------------- /explorer/src/main/res/layout/dialog_exists.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | 18 | 19 | 22 | 23 | 30 | 31 | 39 | 40 | 41 | 44 | 45 | 52 | 53 | 61 | 62 | 63 | 64 | 65 | 69 | 70 | 74 | 75 |