├── .gitignore ├── Changelog ├── LICENSE ├── README.md ├── build.gradle ├── explorer ├── .gitignore ├── build.gradle ├── libs │ └── RootTools-4.2.jar ├── proguard-android.txt └── src │ ├── debug │ └── res │ │ ├── drawable-hdpi │ │ └── ic_launcher.png │ │ ├── drawable-mdpi │ │ └── ic_launcher.png │ │ ├── drawable-xhdpi │ │ └── ic_launcher.png │ │ ├── drawable-xxhdpi │ │ └── ic_launcher.png │ │ ├── drawable-xxxhdpi │ │ └── ic_launcher.png │ │ └── values │ │ └── strings.xml │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── dnielfe │ │ └── manager │ │ ├── AbstractBrowserActivity.java │ │ ├── BrowserActivity.java │ │ ├── PickerActivity.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 │ │ ├── AbstractBrowserFragment.java │ │ ├── BrowserFragment.java │ │ ├── PickerFragment.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 │ │ ├── DirectoryNavigationView.java │ │ └── PageIndicator.java │ │ └── utils │ │ ├── Bookmark.java │ │ ├── BookmarksHelper.java │ │ ├── ClipBoard.java │ │ ├── MediaStoreUtils.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-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 │ ├── holo_dark_action_info.png │ ├── holo_dark_action_search.png │ ├── holo_light_action_info.png │ ├── holo_light_action_search.png │ └── ic_launcher.png │ ├── layout │ ├── activity_browser.xml │ ├── activity_picker.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 │ ├── directory_buttons.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 │ ├── picker_menu.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-ko │ └── 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 │ ├── filepaths.xml │ └── preferences.xml ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.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 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Simple Explorer 2 | =========== 3 | 4 | --- The development of this project has stopped --- 5 | 6 | Simple Explorer is a open source file explorer. 7 | 8 | #### License 9 | ```` 10 | Copyright 2013 - 2015 Daniel F. 11 | 12 | This program is free software; you can redistribute it and/or 13 | modify it under the terms of the GNU General Public License 14 | as published by the Free Software Foundation; either version 3 15 | of the License, or (at your option) any later version. 16 | 17 | This program is distributed in the hope that it will be useful, 18 | but WITHOUT ANY WARRANTY; without even the implied warranty of 19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 | GNU General Public License for more details. 21 | 22 | You should have received a copy of the GNU General Public License 23 | along with this program; if not, write to the Free Software 24 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 25 | MA 02110-1301, USA. 26 | 27 | More info under: https://www.gnu.org/licenses/gpl-3.0 28 | ```` 29 | 30 | #### Credits and Libraries 31 | + [Zedd. for new icons](https://forum.xda-developers.com/member.php?u=4112951) 32 | + [Android-ViewPagerIndicator](https://github.com/JakeWharton/Android-ViewPagerIndicator) 33 | + [FloatingActionButton](https://github.com/makovkastar/FloatingActionButton) 34 | + [RootTools](https://github.com/Stericson/RootTools) 35 | + [Grant](https://github.com/anthonycr/Grant) 36 | 37 | #### Thanks for translations (XDA, Getlocalization and Crowdin) 38 | + bosnian -muamers 39 | + brazil - fabiobatera 40 | + bulgarian - drkalo 41 | + chinese (traditional) - twbetep 42 | + chinese (simplified) - taocp 43 | + czech - svetlemodry 44 | + dutch - kaizokan 45 | + english - youngbrod 46 | + finnish - mary-kate 47 | + french - logpc 48 | + german - DF1E 49 | + hungarian - Wechy77 50 | + italian - mirhl, bovirus 51 | + japanese - naofum 52 | + korean - unrulygnu 53 | + persian - aliashell 54 | + polish - SealQ 55 | + portuguese - smarquespt 56 | + romanian - Silviumik 57 | + russian -lexaleon 58 | + slovakian - pylerSM 59 | + spanish - youngbrod 60 | + swedish - boss302 61 | + thai - atlasslusho 62 | + turkish - adamslast 63 | + ukrainian - DMDP 64 | + vietnamese - hoangnguyen 65 | 66 | #### Discussion Thread 67 | http://forum.xda-developers.com/showthread.php?t=2330864 68 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | repositories { 4 | jcenter() 5 | } 6 | dependencies { 7 | classpath 'com.android.tools.build:gradle:2.2.0' 8 | // NOTE: Do not place your application dependencies here; they belong 9 | // in the individual module build.gradle files 10 | } 11 | } 12 | 13 | allprojects { 14 | repositories { 15 | jcenter() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /explorer/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | explorer-release.apk 3 | explorer-debug.apk 4 | manifest-merger-release-report.txt 5 | fabric.properties -------------------------------------------------------------------------------- /explorer/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.2" 6 | 7 | defaultConfig { 8 | minSdkVersion 16 9 | targetSdkVersion 24 10 | versionCode 67 11 | versionName "2.3.1" 12 | } 13 | 14 | lintOptions { 15 | abortOnError false 16 | disable 'MissingTranslation', 'ExtraTranslation' 17 | } 18 | 19 | packagingOptions { 20 | // Testing support library includes duplicate files from junit-dep and hamcrest-core 21 | exclude 'LICENSE.txt' 22 | } 23 | 24 | buildTypes { 25 | debug { 26 | applicationIdSuffix ".debug" 27 | versionNameSuffix "-DEBUG" 28 | } 29 | release { 30 | minifyEnabled true 31 | shrinkResources true 32 | proguardFiles 'proguard-android.txt' 33 | } 34 | } 35 | } 36 | 37 | dependencies { 38 | compile fileTree(dir: 'libs', include: ['*.jar']) 39 | compile 'com.android.support:support-v13:24.2.0' 40 | compile 'com.android.support:appcompat-v7:24.2.0' 41 | compile 'com.android.support:recyclerview-v7:24.2.0' 42 | compile 'com.melnykov:floatingactionbutton:1.3.0' 43 | compile 'com.anthonycr.grant:permissions:1.1.2' 44 | } 45 | -------------------------------------------------------------------------------- /explorer/libs/RootTools-4.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/debug/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/debug/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/debug/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/debug/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/debug/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/debug/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/debug/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/debug/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/debug/res/drawable-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/debug/res/drawable-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Simple Explorer (debug) 5 | 6 | 7 | -------------------------------------------------------------------------------- /explorer/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 17 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 33 | 38 | 39 | 40 | 41 | 42 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 62 | 65 | 66 | 67 | 68 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/BrowserActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 - 2015 Daniel F. 3 | * 4 | * This program is free software; you can redistribute it and/or 5 | * modify it under the terms of the GNU General Public License 6 | * as published by the Free Software Foundation; either version 3 7 | * of the License, or (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 17 | * MA 02110-1301, USA. 18 | */ 19 | 20 | package com.dnielfe.manager; 21 | 22 | import com.dnielfe.manager.adapters.BrowserTabsAdapter; 23 | import com.dnielfe.manager.fragments.BrowserFragment; 24 | 25 | public final class BrowserActivity extends AbstractBrowserActivity { 26 | @Override 27 | public BrowserFragment getCurrentBrowserFragment() { 28 | return BrowserTabsAdapter.getCurrentBrowserFragment(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/PickerActivity.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.ActionBar; 5 | 6 | import com.dnielfe.manager.fragments.PickerFragment; 7 | 8 | public final class PickerActivity extends AbstractBrowserActivity { 9 | @Override 10 | public void onCreate(Bundle savedInstanceState) { 11 | super.onCreate(savedInstanceState); 12 | setContentView(R.layout.activity_picker); 13 | 14 | initToolbar(); 15 | setToolbarTitle(getText(R.string.picker_choose_one_file)); 16 | initBrowserFragment(); 17 | } 18 | 19 | @Override 20 | public PickerFragment getCurrentBrowserFragment() { 21 | return (PickerFragment) getFragmentManager() 22 | .findFragmentByTag(PickerFragment.TAG); 23 | } 24 | 25 | private void initBrowserFragment() { 26 | final PickerFragment pickerFragment = new PickerFragment(); 27 | getFragmentManager().beginTransaction() 28 | .add(R.id.browser_fragment_container, pickerFragment, PickerFragment.TAG) 29 | .commit(); 30 | } 31 | 32 | private void setToolbarTitle(CharSequence title) { 33 | final ActionBar supportActionBar = getSupportActionBar(); 34 | if (supportActionBar != null) { 35 | getSupportActionBar().setTitle(title); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/ThemableActivity.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | 7 | import com.dnielfe.manager.settings.Settings; 8 | 9 | public abstract class ThemableActivity extends AppCompatActivity { 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.getDefaultTheme(); 19 | setTheme(mCurrentTheme); 20 | super.onCreate(savedInstanceState); 21 | } 22 | 23 | @Override 24 | protected void onResume() { 25 | super.onResume(); 26 | if (mCurrentTheme != Settings.getDefaultTheme()) { 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/dnielfe/manager/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/dnielfe/manager/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 | 25 | private final LayoutInflater mInflater; 26 | private final Resources mResources; 27 | private ArrayList mDataSource; 28 | private final Context mContext; 29 | 30 | public BrowserListAdapter(Context context, LayoutInflater inflater) { 31 | mInflater = inflater; 32 | mContext = context; 33 | mDataSource = new ArrayList<>(); 34 | mResources = context.getResources(); 35 | } 36 | 37 | @Override 38 | public View getView(int position, View convertView, ViewGroup parent) { 39 | final ViewHolder mViewHolder; 40 | int numItems = 0; 41 | final File file = new File(getItem(position)); 42 | DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, 43 | DateFormat.SHORT, Locale.getDefault()); 44 | 45 | if (convertView == null) { 46 | convertView = mInflater.inflate(R.layout.item_browserlist, parent, 47 | false); 48 | mViewHolder = new ViewHolder(convertView); 49 | convertView.setTag(mViewHolder); 50 | } else { 51 | mViewHolder = (ViewHolder) convertView.getTag(); 52 | } 53 | 54 | if (Settings.getListAppearance() > 0) { 55 | mViewHolder.dateview.setVisibility(TextView.VISIBLE); 56 | } else { 57 | mViewHolder.dateview.setVisibility(TextView.GONE); 58 | } 59 | 60 | // get icon 61 | IconPreview.getFileIcon(file, mViewHolder.icon); 62 | 63 | if (file.isFile()) { 64 | // Shows the size of File 65 | mViewHolder.bottomView.setText(SimpleUtils.formatCalculatedSize(file.length())); 66 | } else { 67 | String[] list = file.list(); 68 | 69 | if (list != null) 70 | numItems = list.length; 71 | 72 | // show the number of files in Folder 73 | mViewHolder.bottomView.setText(numItems 74 | + mResources.getString(R.string.files)); 75 | } 76 | 77 | mViewHolder.topView.setText(file.getName()); 78 | mViewHolder.dateview.setText(df.format(file.lastModified())); 79 | 80 | return convertView; 81 | } 82 | 83 | private static class ViewHolder { 84 | final TextView topView; 85 | final TextView bottomView; 86 | final TextView dateview; 87 | final ImageView icon; 88 | 89 | ViewHolder(View view) { 90 | topView = (TextView) view.findViewById(R.id.top_view); 91 | bottomView = (TextView) view.findViewById(R.id.bottom_view); 92 | dateview = (TextView) view.findViewById(R.id.dateview); 93 | icon = (ImageView) view.findViewById(R.id.row_image); 94 | } 95 | } 96 | 97 | public void addFiles(String path) { 98 | if (!mDataSource.isEmpty()) 99 | mDataSource.clear(); 100 | 101 | mDataSource = SimpleUtils.listFiles(path, mContext); 102 | 103 | // sort files with a comparator if not empty 104 | if (!mDataSource.isEmpty()) 105 | SortUtils.sortList(mDataSource, path); 106 | 107 | notifyDataSetChanged(); 108 | } 109 | 110 | public void addContent(ArrayList files) { 111 | if (!mDataSource.isEmpty()) 112 | mDataSource.clear(); 113 | 114 | mDataSource = files; 115 | 116 | notifyDataSetChanged(); 117 | } 118 | 119 | public int getPosition(String path) { 120 | return mDataSource.indexOf(path); 121 | } 122 | 123 | public ArrayList getContent() { 124 | return mDataSource; 125 | } 126 | 127 | @Override 128 | public String getItem(int pos) { 129 | return mDataSource.get(pos); 130 | } 131 | 132 | @Override 133 | public int getCount() { 134 | return mDataSource.size(); 135 | } 136 | 137 | @Override 138 | public long getItemId(int position) { 139 | return position; 140 | } 141 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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 | return new BrowserFragment(); 28 | } 29 | 30 | @Override 31 | public int getCount() { 32 | return NUM_PAGES; 33 | } 34 | 35 | @Override 36 | public void setPrimaryItem(ViewGroup container, int position, Object object) { 37 | if (mCurrentFragment != object) { 38 | mCurrentFragment = (Fragment) object; 39 | } 40 | super.setPrimaryItem(container, position, object); 41 | } 42 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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 | private TextView title = null; 57 | 58 | ViewHolder(View row) { 59 | title = (TextView) row.findViewById(R.id.title); 60 | } 61 | } 62 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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.utils.SimpleUtils; 15 | 16 | import java.io.File; 17 | 18 | public final class CreateFileDialog extends DialogFragment { 19 | 20 | @Override 21 | public Dialog onCreateDialog(Bundle savedInstanceState) { 22 | final Activity a = getActivity(); 23 | 24 | // Set an EditText view to get user input 25 | final EditText inputf = new EditText(a); 26 | inputf.setHint(R.string.enter_name); 27 | 28 | final AlertDialog.Builder b = new AlertDialog.Builder(a); 29 | b.setTitle(R.string.newfile); 30 | b.setView(inputf); 31 | b.setPositiveButton(R.string.create, 32 | new DialogInterface.OnClickListener() { 33 | @Override 34 | public void onClick(DialogInterface dialog, int which) { 35 | String name = inputf.getText().toString(); 36 | String path = BrowserTabsAdapter.getCurrentBrowserFragment().mCurrentPath; 37 | 38 | if (name.length() >= 1) { 39 | boolean success = SimpleUtils.createFile(new File(path, name)); 40 | 41 | if (success) 42 | Toast.makeText(a, R.string.filecreated, Toast.LENGTH_SHORT).show(); 43 | else 44 | Toast.makeText(a, R.string.error, Toast.LENGTH_SHORT).show(); 45 | } 46 | 47 | dialog.dismiss(); 48 | } 49 | }); 50 | b.setNegativeButton(R.string.cancel, 51 | new DialogInterface.OnClickListener() { 52 | @Override 53 | public void onClick(DialogInterface dialog, int which) { 54 | dialog.dismiss(); 55 | } 56 | }); 57 | return b.create(); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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 | import java.io.File; 17 | 18 | public final class CreateFolderDialog extends DialogFragment { 19 | 20 | @Override 21 | public Dialog onCreateDialog(Bundle savedInstanceState) { 22 | final Activity a = getActivity(); 23 | 24 | // Set an EditText view to get user input 25 | final EditText inputf = new EditText(a); 26 | inputf.setHint(R.string.enter_name); 27 | 28 | final AlertDialog.Builder b = new AlertDialog.Builder(a); 29 | b.setTitle(R.string.createnewfolder); 30 | b.setMessage(R.string.createmsg); 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 location = BrowserTabsAdapter.getCurrentBrowserFragment().mCurrentPath; 38 | boolean success = false; 39 | 40 | if (name.length() >= 1) 41 | success = SimpleUtils.createDir(new File(location, name)); 42 | 43 | if (success) 44 | Toast.makeText(a, 45 | name + getString(R.string.created), 46 | Toast.LENGTH_LONG).show(); 47 | else 48 | Toast.makeText(a, 49 | getString(R.string.newfolderwasnotcreated), 50 | Toast.LENGTH_SHORT).show(); 51 | 52 | dialog.dismiss(); 53 | } 54 | }); 55 | b.setNegativeButton(R.string.cancel, 56 | new DialogInterface.OnClickListener() { 57 | @Override 58 | public void onClick(DialogInterface dialog, int which) { 59 | dialog.dismiss(); 60 | } 61 | }); 62 | return b.create(); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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/dnielfe/manager/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/dnielfe/manager/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 | 41 | final EditText inputowner = (EditText) view.findViewById(R.id.owner); 42 | inputowner.setText(oldowner); 43 | 44 | final EditText inputgroup = (EditText) view.findViewById(R.id.group); 45 | inputgroup.setText(oldgroup); 46 | 47 | final AlertDialog.Builder b = new AlertDialog.Builder(a); 48 | b.setTitle(R.string.edit); 49 | b.setView(view); 50 | b.setPositiveButton(getString(R.string.ok), 51 | new DialogInterface.OnClickListener() { 52 | @Override 53 | public void onClick(DialogInterface dialog, int whichButton) { 54 | String newgroup = inputgroup.getText().toString(); 55 | String newowner = inputowner.getText().toString(); 56 | 57 | dialog.dismiss(); 58 | 59 | if (newgroup.length() > 1 && newowner.length() > 1) { 60 | final GroupOwnerTask task = new GroupOwnerTask(a, newgroup, newowner); 61 | task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, file); 62 | } 63 | } 64 | }); 65 | b.setNegativeButton(R.string.cancel, 66 | new DialogInterface.OnClickListener() { 67 | @Override 68 | public void onClick(DialogInterface dialog, int which) { 69 | dialog.dismiss(); 70 | } 71 | }); 72 | return b.create(); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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/dnielfe/manager/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/dnielfe/manager/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) + " (" + 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/dnielfe/manager/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/dnielfe/manager/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/dnielfe/manager/fragments/BrowserFragment.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.fragments; 2 | 3 | public final class BrowserFragment extends AbstractBrowserFragment { 4 | // Implements default behavior from AbstractBrowserFragment 5 | } 6 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/fragments/PickerFragment.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.fragments; 2 | 3 | import android.app.Activity; 4 | import android.content.Intent; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.support.v4.content.FileProvider; 8 | import android.view.LayoutInflater; 9 | import android.view.Menu; 10 | import android.view.MenuInflater; 11 | import android.view.MenuItem; 12 | import android.view.View; 13 | import android.view.ViewGroup; 14 | 15 | import com.dnielfe.manager.R; 16 | import com.melnykov.fab.FloatingActionButton; 17 | 18 | import java.io.File; 19 | 20 | public final class PickerFragment extends AbstractBrowserFragment { 21 | public static final String TAG = "PickerFragment"; 22 | 23 | @Override 24 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 25 | Bundle savedInstanceState) { 26 | View rootView = inflater.inflate(R.layout.fragment_browser, container, false); 27 | 28 | initList(inflater, rootView); 29 | initFab(rootView); 30 | return rootView; 31 | } 32 | 33 | @Override 34 | public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 35 | inflater.inflate(R.menu.picker_menu, menu); 36 | } 37 | 38 | @Override 39 | public boolean onOptionsItemSelected(MenuItem item) { 40 | switch (item.getItemId()) { 41 | case R.id.pick_cancel: 42 | getActivity().finish(); 43 | default: 44 | return super.onOptionsItemSelected(item); 45 | } 46 | } 47 | 48 | @Override 49 | public void listItemAction(File file) { 50 | final Uri pickedUri = FileProvider.getUriForFile(getActivity(), "com.dnielfe.manager.fileprovider", file); 51 | 52 | final Intent result = new Intent(); 53 | result.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 54 | result.setData(pickedUri); 55 | 56 | final Activity activity = getActivity(); 57 | activity.setResult(Activity.RESULT_OK, result); 58 | activity.finish(); 59 | } 60 | 61 | @Override 62 | protected void initFab(View rootView) { 63 | FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fabbutton); 64 | fab.setVisibility(View.GONE); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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/dnielfe/manager/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/dnielfe/manager/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/dnielfe/manager/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 Settings() {} 14 | 15 | private static SharedPreferences mPrefs; 16 | 17 | private static int mTheme; 18 | 19 | public static void updatePreferences(Context context) { 20 | mPrefs = PreferenceManager.getDefaultSharedPreferences(context); 21 | 22 | mTheme = Integer.parseInt(mPrefs.getString("preference_theme", Integer.toString(R.style.ThemeLight))); 23 | 24 | rootAccess(); 25 | } 26 | 27 | public static boolean showThumbnail() { 28 | return mPrefs.getBoolean("showpreview", true); 29 | } 30 | 31 | public static boolean showHiddenFiles() { 32 | return mPrefs.getBoolean("displayhiddenfiles", true); 33 | } 34 | 35 | public static boolean rootAccess() { 36 | return mPrefs.getBoolean("enablerootaccess", false) && RootTools.isAccessGiven(); 37 | } 38 | 39 | public static boolean reverseListView() { 40 | return mPrefs.getBoolean("reverseList", false); 41 | } 42 | 43 | public static String getDefaultDir() { 44 | return mPrefs.getString("defaultdir", Environment.getExternalStorageDirectory().getPath()); 45 | } 46 | 47 | public static int getListAppearance() { 48 | return Integer.parseInt(mPrefs.getString("viewmode", "1")); 49 | } 50 | 51 | public static int getSortType() { 52 | return Integer.parseInt(mPrefs.getString("sort", "1")); 53 | } 54 | 55 | public static int getDefaultTheme() { 56 | return mTheme; 57 | } 58 | 59 | public static void setDefaultTheme(int theme) { 60 | mTheme = theme; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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/dnielfe/manager/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 | addPreferencesFromResource(R.xml.preferences); 21 | 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("Should be attached only to SettingsActivity"); 29 | } 30 | } 31 | 32 | private void init() { 33 | final ListPreference theme = (ListPreference) findPreference("preference_theme"); 34 | theme.setEntryValues(THEMES_VALUES); 35 | theme.setValue(String.valueOf(Settings.getDefaultTheme())); 36 | theme.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 37 | @Override 38 | public boolean onPreferenceChange(Preference preference, Object newValue) { 39 | final int chosenTheme = Integer.parseInt((String) newValue); 40 | if (chosenTheme != Settings.getDefaultTheme()) { 41 | Settings.setDefaultTheme(chosenTheme); 42 | ((SettingsActivity) getActivity()).proxyRestart(); 43 | return true; 44 | } 45 | return false; 46 | } 47 | }); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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/dnielfe/manager/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.MediaStoreUtils; 11 | import com.dnielfe.manager.utils.SimpleUtils; 12 | import com.dnielfe.manager.utils.ZipUtils; 13 | 14 | import java.io.File; 15 | import java.lang.ref.WeakReference; 16 | import java.util.ArrayList; 17 | import java.util.Arrays; 18 | import java.util.List; 19 | 20 | public final class ExtractionTask extends AsyncTask> { 21 | 22 | private final WeakReference activity; 23 | private ProgressDialog dialog; 24 | 25 | public ExtractionTask(final Activity activity) { 26 | this.activity = new WeakReference<>(activity); 27 | } 28 | 29 | @Override 30 | protected void onPreExecute() { 31 | final Activity activity = this.activity.get(); 32 | 33 | if (activity != null) { 34 | this.dialog = new ProgressDialog(activity); 35 | this.dialog.setMessage(activity.getString(R.string.unzipping)); 36 | this.dialog.setCancelable(true); 37 | this.dialog 38 | .setOnCancelListener(new DialogInterface.OnCancelListener() { 39 | @Override 40 | public void onCancel(DialogInterface dialog) { 41 | cancel(false); 42 | } 43 | }); 44 | if (!activity.isFinishing()) { 45 | this.dialog.show(); 46 | } 47 | } 48 | } 49 | 50 | @Override 51 | protected List doInBackground(File... files) { 52 | final Activity activity = this.activity.get(); 53 | final List failed = new ArrayList<>(); 54 | final String ext = SimpleUtils.getExtension(files[0].getName()); 55 | 56 | try { 57 | if (ext.equals("zip")) { 58 | ZipUtils.unpackZip(files[0], files[1]); 59 | } 60 | } catch (Exception e) { 61 | failed.add(Arrays.toString(files)); 62 | } 63 | 64 | if (files[1].canRead()) { 65 | for (File file : files[1].listFiles()) 66 | MediaStoreUtils.addFileToMediaStore(file.getPath(), activity); 67 | } 68 | return failed; 69 | } 70 | 71 | @Override 72 | protected void onPostExecute(final List failed) { 73 | super.onPostExecute(failed); 74 | this.finish(failed); 75 | } 76 | 77 | @Override 78 | protected void onCancelled(final List failed) { 79 | super.onCancelled(failed); 80 | this.finish(failed); 81 | } 82 | 83 | private void finish(final List failed) { 84 | if (this.dialog != null) { 85 | this.dialog.dismiss(); 86 | } 87 | 88 | final Activity activity = this.activity.get(); 89 | 90 | if (failed.isEmpty()) 91 | Toast.makeText(activity, activity.getString(R.string.extractionsuccess), 92 | Toast.LENGTH_SHORT).show(); 93 | 94 | if (activity != null && !failed.isEmpty()) { 95 | Toast.makeText(activity, activity.getString(R.string.cantopenfile), 96 | Toast.LENGTH_SHORT).show(); 97 | if (!activity.isFinishing()) { 98 | dialog.show(); 99 | } 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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/dnielfe/manager/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.MediaStoreUtils; 12 | import com.dnielfe.manager.utils.SimpleUtils; 13 | 14 | import java.io.File; 15 | import java.lang.ref.WeakReference; 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | public final class PasteTask extends AsyncTask> { 20 | 21 | private final WeakReference activity; 22 | 23 | private ProgressDialog dialog; 24 | 25 | private final File location; 26 | 27 | private boolean success = false; 28 | 29 | public PasteTask(final Activity activity, File currentDir) { 30 | this.activity = new WeakReference<>(activity); 31 | this.location = currentDir; 32 | } 33 | 34 | @Override 35 | protected void onPreExecute() { 36 | final Activity activity = this.activity.get(); 37 | 38 | if (activity != null) { 39 | this.dialog = new ProgressDialog(activity); 40 | 41 | if (ClipBoard.isMove()) 42 | this.dialog.setMessage(activity.getString(R.string.moving)); 43 | else 44 | this.dialog.setMessage(activity.getString(R.string.copying)); 45 | 46 | this.dialog.setCancelable(true); 47 | this.dialog 48 | .setOnCancelListener(new DialogInterface.OnCancelListener() { 49 | @Override 50 | public void onCancel(DialogInterface dialog) { 51 | cancel(false); 52 | } 53 | }); 54 | if (!activity.isFinishing()) { 55 | this.dialog.show(); 56 | } 57 | } 58 | } 59 | 60 | @Override 61 | protected List doInBackground(String... content) { 62 | final List failed = new ArrayList<>(); 63 | final Activity activity = this.activity.get(); 64 | ClipBoard.lock(); 65 | 66 | for (String s : content) { 67 | String fileName = s.substring(s.lastIndexOf("/"), s.length()); 68 | if (ClipBoard.isMove()) { 69 | SimpleUtils.moveToDirectory(new File(s), new File(location, fileName), activity); 70 | success = true; 71 | } else { 72 | SimpleUtils.copyFile(new File(s), new File(location, fileName), activity); 73 | success = true; 74 | } 75 | } 76 | 77 | if (location.canRead()) { 78 | for (File file : location.listFiles()) 79 | MediaStoreUtils.addFileToMediaStore(file.getPath(), activity); 80 | } 81 | return failed; 82 | } 83 | 84 | @Override 85 | protected void onPostExecute(final List failed) { 86 | super.onPostExecute(failed); 87 | this.finish(failed); 88 | } 89 | 90 | @Override 91 | protected void onCancelled(final List failed) { 92 | super.onCancelled(failed); 93 | this.finish(failed); 94 | } 95 | 96 | private void finish(final List failed) { 97 | if (this.dialog != null) { 98 | this.dialog.dismiss(); 99 | } 100 | 101 | final Activity activity = this.activity.get(); 102 | 103 | if (ClipBoard.isMove()) { 104 | if (success) 105 | Toast.makeText(activity, 106 | activity.getString(R.string.movesuccsess), 107 | Toast.LENGTH_SHORT).show(); 108 | else 109 | Toast.makeText(activity, activity.getString(R.string.movefail), 110 | Toast.LENGTH_SHORT).show(); 111 | } else { 112 | if (success) 113 | Toast.makeText(activity, 114 | activity.getString(R.string.copysuccsess), 115 | Toast.LENGTH_SHORT).show(); 116 | else 117 | Toast.makeText(activity, activity.getString(R.string.copyfail), 118 | Toast.LENGTH_SHORT).show(); 119 | } 120 | 121 | ClipBoard.unlock(); 122 | ClipBoard.clear(); 123 | activity.invalidateOptionsMenu(); 124 | 125 | if (!failed.isEmpty()) { 126 | Toast.makeText(activity, activity.getString(R.string.cantopenfile), 127 | Toast.LENGTH_SHORT).show(); 128 | if (!activity.isFinishing()) { 129 | dialog.show(); 130 | } 131 | } 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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 File 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 = new File(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/dnielfe/manager/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/dnielfe/manager/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/dnielfe/manager/ui/DirectoryNavigationView.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 DirectoryNavigationView { 20 | 21 | public final Set listeners; 22 | private final Activity mActivity; 23 | private static final int TEXT_SIZE = 16; 24 | private static final int WRAP_CONTENT = LinearLayout.LayoutParams.WRAP_CONTENT; 25 | private static final int MATCH_PARENT = LinearLayout.LayoutParams.MATCH_PARENT; 26 | 27 | public interface OnNavigateListener { 28 | void onNavigate(String path); 29 | } 30 | 31 | public DirectoryNavigationView(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, android.R.attr.actionButtonStyle); 49 | t0.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, MATCH_PARENT, 50 | Gravity.CENTER_VERTICAL)); 51 | t0.setText("/"); 52 | t0.setTextSize(TEXT_SIZE); 53 | t0.setTag(dir); 54 | t0.setOnClickListener(new OnClickListener() { 55 | @Override 56 | public void onClick(View view) { 57 | for (final OnNavigateListener listener : listeners) { 58 | listener.onNavigate("/"); 59 | } 60 | } 61 | }); 62 | 63 | mView.addView(t0); 64 | 65 | // Add other buttons 66 | for (int i = 1; i < parts.length; i++) { 67 | dir += "/" + parts[i]; 68 | 69 | // add a LinearLayout as a divider 70 | FrameLayout fv1 = new FrameLayout(mActivity); 71 | LinearLayout divider = (LinearLayout) mActivity.getLayoutInflater() 72 | .inflate(R.layout.item_navigation_divider, null); 73 | fv1.addView(divider); 74 | fv1.setLayoutParams(new FrameLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, 75 | Gravity.CENTER_VERTICAL)); 76 | 77 | // add clickable TextView 78 | TextView t2 = new TextView(mActivity, null, android.R.attr.actionButtonStyle); 79 | t2.setLayoutParams(new LinearLayout.LayoutParams(WRAP_CONTENT, MATCH_PARENT, 80 | Gravity.CENTER_VERTICAL)); 81 | t2.setText(parts[i]); 82 | t2.setTextSize(TEXT_SIZE); 83 | t2.setTag(dir); 84 | t2.setOnClickListener(new OnClickListener() { 85 | @Override 86 | public void onClick(View view) { 87 | String dir1 = (String) view.getTag(); 88 | for (final OnNavigateListener listener : listeners) { 89 | listener.onNavigate(dir1); 90 | } 91 | } 92 | }); 93 | 94 | t2.setOnLongClickListener(new View.OnLongClickListener() { 95 | public boolean onLongClick(View view) { 96 | String dir1 = (String) view.getTag(); 97 | SimpleUtils.savetoClipBoard(mActivity, dir1); 98 | return true; 99 | } 100 | }); 101 | 102 | mView.addView(fv1); 103 | mView.addView(t2); 104 | scrolltext.postDelayed(new Runnable() { 105 | @Override 106 | public void run() { 107 | HorizontalScrollView hv = (HorizontalScrollView) mActivity 108 | .findViewById(R.id.scroll_text); 109 | hv.fullScroll(HorizontalScrollView.FOCUS_RIGHT); 110 | } 111 | }, 100L); 112 | } 113 | } 114 | 115 | public void addonNavigateListener(final OnNavigateListener listener) { 116 | this.listeners.add(listener); 117 | } 118 | 119 | public void removeOnNavigateListener(final OnNavigateListener listener) { 120 | this.listeners.remove(listener); 121 | } 122 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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/dnielfe/manager/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 | import android.os.Environment; 9 | 10 | import java.util.LinkedList; 11 | import java.util.List; 12 | 13 | public class BookmarksHelper extends SQLiteOpenHelper { 14 | 15 | // Database Version 16 | private static final int DATABASE_VERSION = 1; 17 | // Database Name 18 | private static final String DATABASE_NAME = "BookmarksDB"; 19 | // Books table name 20 | private static final String TABLE_BOOKS = "bookmarks"; 21 | // Books Table Columns names 22 | private static final String KEY_ID = "id"; 23 | private static final String KEY_NAME = "name"; 24 | private static final String KEY_PATH = "path"; 25 | 26 | public BookmarksHelper(Context context) { 27 | super(context, DATABASE_NAME, null, DATABASE_VERSION); 28 | } 29 | 30 | @Override 31 | public void onCreate(SQLiteDatabase db) { 32 | // SQL statement to create book table 33 | String CREATE_BOOK_TABLE = "CREATE TABLE " + TABLE_BOOKS + " (id " + 34 | "INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, path Text)"; 35 | 36 | // create books table 37 | db.execSQL(CREATE_BOOK_TABLE); 38 | 39 | // add SDCard bookmark at start 40 | addBookmarkOnCreate(db, new Bookmark("SDCard", Environment.getExternalStorageDirectory().getPath())); 41 | // add root bookmark at start 42 | addBookmarkOnCreate(db, new Bookmark("Root", "/")); 43 | // add system bookmark at start 44 | addBookmarkOnCreate(db, new Bookmark("System", Environment.getRootDirectory().getPath())); 45 | } 46 | 47 | @Override 48 | public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 49 | db.execSQL("DROP TABLE IF EXISTS bookmarks"); 50 | this.onCreate(db); 51 | } 52 | 53 | public List getAllBooks() { 54 | List books = new LinkedList<>(); 55 | 56 | String query = "SELECT * FROM " + TABLE_BOOKS; 57 | 58 | SQLiteDatabase db = getWritableDatabase(); 59 | Cursor cursor = db.rawQuery(query, null); 60 | 61 | // go over each row, build book and add it to list 62 | Bookmark book; 63 | if (cursor.moveToFirst()) { 64 | do { 65 | book = new Bookmark(); 66 | book.setId(Integer.parseInt(cursor.getString(0))); 67 | book.setName(cursor.getString(1)); 68 | book.setPath(cursor.getString(2)); 69 | books.add(book); 70 | } while (cursor.moveToNext()); 71 | } 72 | 73 | return books; 74 | } 75 | 76 | public void addBookmarkOnCreate(SQLiteDatabase db, Bookmark book) { 77 | ContentValues values = new ContentValues(); 78 | values.put(KEY_NAME, book.getName()); 79 | values.put(KEY_PATH, book.getPath()); 80 | 81 | db.insert(TABLE_BOOKS, null, values); 82 | } 83 | 84 | public void addBookmark(Bookmark book) { 85 | SQLiteDatabase db = getWritableDatabase(); 86 | 87 | ContentValues values = new ContentValues(); 88 | values.put(KEY_NAME, book.getName()); 89 | values.put(KEY_PATH, book.getPath()); 90 | 91 | db.insert(TABLE_BOOKS, null, values); 92 | db.close(); 93 | } 94 | 95 | public void deleteBook(Bookmark book) { 96 | SQLiteDatabase db = getWritableDatabase(); 97 | db.delete(TABLE_BOOKS, KEY_ID + " = ?", new String[]{String.valueOf(book.getId())}); 98 | db.close(); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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/dnielfe/manager/utils/MediaStoreUtils.java: -------------------------------------------------------------------------------- 1 | package com.dnielfe.manager.utils; 2 | 3 | import android.content.ContentResolver; 4 | import android.content.ContentValues; 5 | import android.content.Context; 6 | import android.content.Intent; 7 | import android.database.Cursor; 8 | import android.net.Uri; 9 | import android.provider.BaseColumns; 10 | import android.provider.MediaStore; 11 | import android.provider.MediaStore.MediaColumns; 12 | 13 | import java.io.File; 14 | 15 | public abstract class MediaStoreUtils { 16 | 17 | private MediaStoreUtils() {} 18 | 19 | public static Uri getUriFromFile(final String path, Context context) { 20 | ContentResolver resolver = context.getContentResolver(); 21 | 22 | Cursor filecursor = resolver.query(MediaStore.Files.getContentUri("external"), 23 | new String[]{BaseColumns._ID}, MediaColumns.DATA + " = ?", 24 | new String[]{path}, MediaColumns.DATE_ADDED + " desc"); 25 | filecursor.moveToFirst(); 26 | 27 | if (filecursor.isAfterLast()) { 28 | filecursor.close(); 29 | ContentValues values = new ContentValues(); 30 | values.put(MediaColumns.DATA, path); 31 | return resolver.insert(MediaStore.Files.getContentUri("external"), values); 32 | } else { 33 | int imageId = filecursor.getInt(filecursor.getColumnIndex(BaseColumns._ID)); 34 | Uri uri = MediaStore.Files.getContentUri("external").buildUpon().appendPath( 35 | Integer.toString(imageId)).build(); 36 | filecursor.close(); 37 | return uri; 38 | } 39 | } 40 | 41 | public static void addFileToMediaStore(final String path, Context context) { 42 | Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 43 | File file = new File(path); 44 | Uri contentUri = Uri.fromFile(file); 45 | mediaScanIntent.setData(contentUri); 46 | context.sendBroadcast(mediaScanIntent); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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/dnielfe/manager/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 | * This can be removed if minApi = 18. 10 | */ 11 | public final class StatFsCompat { 12 | 13 | /** 14 | * StatFs instance 15 | */ 16 | private final StatFs mStatFs; 17 | 18 | /** 19 | * Construct a new StatFs for looking at the stats of the filesystem at 20 | * {@code path}. Upon construction, the stat of the file system will be 21 | * performed, and the values retrieved available from the methods on this 22 | * class. 23 | * 24 | * @param path path in the desired file system to stat. 25 | */ 26 | public StatFsCompat(final String path) { 27 | this.mStatFs = new StatFs(path); 28 | } 29 | 30 | /** 31 | * The number of blocks that are free on the file system and available to 32 | * applications. This corresponds to the Unix {@code statvfs.f_bavail} 33 | * field. 34 | */ 35 | @SuppressLint("NewApi") 36 | @SuppressWarnings("deprecation") 37 | public long getAvailableBlocksLong() { 38 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 39 | return mStatFs.getAvailableBlocksLong(); 40 | } else { 41 | return mStatFs.getAvailableBlocks(); 42 | } 43 | } 44 | 45 | /** 46 | * The total number of blocks on the file system. This corresponds to the 47 | * Unix {@code statvfs.f_blocks} field. 48 | */ 49 | @SuppressLint("NewApi") 50 | @SuppressWarnings("deprecation") 51 | public long getBlockCountLong() { 52 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 53 | return mStatFs.getBlockCountLong(); 54 | } else { 55 | return mStatFs.getBlockCount(); 56 | } 57 | } 58 | 59 | /** 60 | * The size, in bytes, of a block on the file system. This corresponds to 61 | * the Unix {@code statvfs.f_bsize} field. 62 | */ 63 | @SuppressLint("NewApi") 64 | @SuppressWarnings("deprecation") 65 | public long getBlockSizeLong() { 66 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 67 | return mStatFs.getBlockSizeLong(); 68 | } else { 69 | return mStatFs.getBlockSize(); 70 | } 71 | } 72 | 73 | /** 74 | * The total number of blocks that are free on the file system, including 75 | * reserved blocks (that are not available to normal applications). This 76 | * corresponds to the Unix {@code statvfs.f_bfree} field. Most applications 77 | * will want to use {@link #getAvailableBlocksLong()} instead. 78 | */ 79 | @SuppressLint("NewApi") 80 | @SuppressWarnings("deprecation") 81 | public long getFreeBlocksLong() { 82 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 83 | return mStatFs.getFreeBlocksLong(); 84 | } else { 85 | return mStatFs.getFreeBlocks(); 86 | } 87 | } 88 | 89 | /** 90 | * The number of bytes that are free on the file system and available to 91 | * applications. 92 | */ 93 | @SuppressLint("NewApi") 94 | public long getAvailableBytes() { 95 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 96 | return mStatFs.getAvailableBytes(); 97 | } else { 98 | return getAvailableBlocksLong() * getBlockSizeLong(); 99 | } 100 | } 101 | 102 | /** 103 | * The number of bytes that are free on the file system, including reserved 104 | * blocks (that are not available to normal applications). Most applications 105 | * will want to use {@link #getAvailableBytes()} instead. 106 | */ 107 | @SuppressLint("NewApi") 108 | public long getFreeBytes() { 109 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 110 | return mStatFs.getFreeBytes(); 111 | } else { 112 | return getFreeBlocksLong() * getBlockSizeLong(); 113 | } 114 | } 115 | 116 | /** 117 | * The total number of bytes supported by the file system. 118 | */ 119 | public long getTotalBytes() { 120 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { 121 | return mStatFs.getTotalBytes(); 122 | } else { 123 | return getBlockCountLong() * getBlockSizeLong(); 124 | } 125 | } 126 | } -------------------------------------------------------------------------------- /explorer/src/main/java/com/dnielfe/manager/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 ZipUtils() {} 17 | 18 | private static final int BUFFER = 8192; 19 | 20 | public static void createZip(String[] files, String zipFile) { 21 | ZipOutputStream out = null; 22 | try { 23 | FileOutputStream dest = new FileOutputStream(zipFile); 24 | out = new ZipOutputStream(new BufferedOutputStream(dest)); 25 | 26 | for (String s : files) { 27 | File file = new File(s); 28 | 29 | if (file.isDirectory()) { 30 | zipSubFolder(out, file, file.getParent().length()); 31 | } else { 32 | zipFile(out, file); 33 | } 34 | } 35 | } catch (Exception e) { 36 | e.printStackTrace(); 37 | } finally { 38 | if (out != null) { 39 | try { 40 | out.close(); 41 | } catch (IOException e) { 42 | // ignore 43 | } 44 | } 45 | } 46 | } 47 | 48 | public static void unpackZip(File zipFile, File location) { 49 | ZipFile zf = null; 50 | try { 51 | // Extract entries while creating required sub-directories 52 | zf = new ZipFile(zipFile); 53 | Enumeration e = zf.entries(); 54 | 55 | while (e.hasMoreElements()) { 56 | ZipEntry entry = (ZipEntry) e.nextElement(); 57 | File destinationFilePath = new File(location, entry.getName()); 58 | 59 | // create directories if required. 60 | destinationFilePath.getParentFile().mkdirs(); 61 | 62 | // if the entry is directory, leave it. Otherwise extract it. 63 | if (!entry.isDirectory()) { 64 | // Get the InputStream for current entry of the zip file 65 | // using InputStream getInputStream(Entry entry) method. 66 | BufferedInputStream bis = new BufferedInputStream(zf.getInputStream(entry)); 67 | 68 | int b; 69 | byte[] buffer = new byte[BUFFER]; 70 | 71 | // read the current entry from the zip file, extract it and 72 | // write the extracted file. 73 | FileOutputStream fos = new FileOutputStream(destinationFilePath); 74 | BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER); 75 | 76 | while ((b = bis.read(buffer, 0, 1024)) != -1) { 77 | bos.write(buffer, 0, b); 78 | } 79 | 80 | bos.flush(); 81 | bos.close(); 82 | bis.close(); 83 | } 84 | } 85 | } catch (IOException ioe) { 86 | ioe.printStackTrace(); 87 | } finally { 88 | if (zf != null) { 89 | try { 90 | zf.close(); 91 | } catch (IOException e) { 92 | // ignore 93 | } 94 | } 95 | } 96 | } 97 | 98 | private static void zipSubFolder(ZipOutputStream out, File folder, 99 | int basePathLength) throws IOException { 100 | File[] fileList = folder.listFiles(); 101 | 102 | for (File file : fileList) { 103 | if (file.isDirectory()) { 104 | zipSubFolder(out, file, basePathLength); 105 | } else { 106 | BufferedInputStream origin; 107 | byte[] data = new byte[BUFFER]; 108 | String unmodifiedFilePath = file.getPath(); 109 | String relativePath = unmodifiedFilePath 110 | .substring(basePathLength); 111 | 112 | FileInputStream fi = new FileInputStream(unmodifiedFilePath); 113 | origin = new BufferedInputStream(fi, BUFFER); 114 | ZipEntry entry = new ZipEntry(relativePath); 115 | out.putNextEntry(entry); 116 | int count; 117 | while ((count = origin.read(data, 0, BUFFER)) != -1) { 118 | out.write(data, 0, count); 119 | } 120 | origin.close(); 121 | } 122 | } 123 | } 124 | 125 | private static void zipFile(ZipOutputStream out, File file) 126 | throws IOException { 127 | BufferedInputStream origin; 128 | byte[] data = new byte[BUFFER]; 129 | String str = file.getPath(); 130 | 131 | FileInputStream fi = new FileInputStream(str); 132 | origin = new BufferedInputStream(fi, BUFFER); 133 | ZipEntry entry = new ZipEntry(str.substring(str.lastIndexOf("/") + 1)); 134 | out.putNextEntry(entry); 135 | int count; 136 | while ((count = origin.read(data, 0, BUFFER)) != -1) { 137 | out.write(data, 0, count); 138 | } 139 | origin.close(); 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/actionpaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/actionpaste.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/drawer_shadow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/holo_light_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_apk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_apk.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_config.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_folder.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_folder_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_folder_empty.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_html.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_music.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_note.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_package.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_pdf.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_pic.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_unknown.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_video.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-hdpi/type_xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-hdpi/type_xml.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/actionpaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/actionpaste.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/drawer_shadow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/holo_light_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_apk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_apk.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_config.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_folder.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_folder_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_folder_empty.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_html.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_music.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_note.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_package.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_pdf.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_pic.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_unknown.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_video.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xhdpi/type_xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xhdpi/type_xml.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/actionpaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/actionpaste.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/drawer_shadow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/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/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/holo_light_ic_storage.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_apk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_apk.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_config.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_folder.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_folder_empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_folder_empty.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_html.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_music.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_note.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_package.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_pdf.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_pic.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_unknown.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_video.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxhdpi/type_xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxhdpi/type_xml.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxxhdpi/holo_dark_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxxhdpi/holo_dark_action_info.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxxhdpi/holo_dark_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxxhdpi/holo_dark_action_search.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxxhdpi/holo_light_action_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxxhdpi/holo_light_action_info.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxxhdpi/holo_light_action_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxxhdpi/holo_light_action_search.png -------------------------------------------------------------------------------- /explorer/src/main/res/drawable-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DF1E/SimpleExplorer/808fb80eeb2c1efbfb576972414a214970007c1c/explorer/src/main/res/drawable-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /explorer/src/main/res/layout/activity_browser.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 26 | 27 | 31 | 32 | 33 | 34 | 35 | 42 | 43 | -------------------------------------------------------------------------------- /explorer/src/main/res/layout/activity_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | 22 | 23 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /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 |