Coder Social home page Coder Social logo

codekidx / storage-chooser Goto Github PK

View Code? Open in Web Editor NEW
719.0 31.0 153.0 695 KB

Lets user choose files in internal or external storage with just few lines of code.

License: Mozilla Public License 2.0

Java 100.00%
storage-chooser picker file-picker android-filepicker

storage-chooser's Introduction

Storage Chooser !News

SC Features

Documentation Version
Documentation

A pretty and simple directory chooser and file picker library for 4.4+ devices. This library was created to be included in OpenGApps App. There are too many storage chooser out there but this one is too materially 😛 . Easy to implement and does not take a lot of your valueable time in setting-up all the other necessary things that every developer seeks, like

  • saving path to sharedPreference
  • event when path is selected and act upon that path
  • and much more.

There are also some really nice features that I thought would come in handy:

  • You show a quick overview of the storages present and their memory available before choosing so that users know which storage to choose.
  • you can choose between sheet and sleek layouts.
  • Inline create folder view (not another dialog to handle)
  • Full localization. I mean literally every strings can be localized to your desired language.
  • Memory thresholding - a restriction or a toast that it shows when user's memory is less than your defined memory of operations.
  • and more will be added soon.

Installation

Add this to your root build.gradle file under repositories:

allprojects {
	repositories {
		maven { url "https://jitpack.io" }
	}
}

Add this to your app level build.gradle as dependency:

com.github.codekidX:storage-chooser:2.0.4.4

Add this to your gradle.properties file:

android.enableJetifier=true
android.useAndroidX=true

Android 10 News

You can currently use this library on Android 10 devices by adding android:requestLegacyExternalStorage="true" to your AndroidManifest.xml. The release of 3.0 was to happen by December 2019 but was put to hold in light of new situations and re-evaluation of what is more important to this library, features? stability? future-ready?.

There is an implementation of SAF going on in inline-3.0 branch and would surface in this release as a breaking change.

Notes

In order to save state between orientation, storage-chooser requires you to add this to AndroidManifest.xml activity tag

Before you implement this library here are some notes that you can follow to avoid errors.

android:configChanges="orientation|screenSize"

Confirm:

  • You have asked for Runtime Permission from the user in the past to avoid read errors.
  • Permissions with "READ_EXTERNAL_STORAGE" and "WRITE_EXTERNAL_STORAGE" is enough for this library to work.
  • This library follows same color scheme as that of the parent app to maintain the aesthetic of the parent app. See the color scheme section below

Implementation

Simple Type

  • Let's you toggle between internal/external root directory.
// Initialize Builder
StorageChooser chooser = new StorageChooser.Builder()
.withActivity(MainActivity.this)
.withFragmentManager(getFragmentManager())
.withMemoryBar(true)
.build();

// Show dialog whenever you want by
chooser.show();

// get path that the user has chosen
chooser.setOnSelectListener(new StorageChooser.OnSelectListener() {
    @Override
    public void onSelect(String path) {
        Log.e("SELECTED_PATH", path);
    }
});

OUTPUT: /storage/emulated/0

Pre-defined Type

  • Let's you append a specific path to the root of internal or external directory.
// --- ADD --
.withPredefinedPath(STATIC_PATH)

OUTPUT: /storage/emulated/0/Downloads/CodekidLabs

Custom Type

  • Let's your user choose custom directory/file.

Directory Chooser

// --- ADD ---
.allowCustomPath(true)
.setType(StorageChooser.DIRECTORY_CHOOSER)

File Picker

// --- ADD ---
.allowCustomPath(true)
.setType(StorageChooser.FILE_PICKER)

Save directly to preference

// --- ADD ---
.actionSave(true)
.withPreference(sharedPreferences)

Get path from preference

String path = sharedPreferences.getString(DiskUtil.SC_PREFERENCE_KEY,"");

(2.0+) Multiselect

It's already in there you don't need to write any special code for it. Just make sure your type of chooser is of type FILE_PICKER. builder.setType(StorageChooser.FILE_PICKER);

More information

License

This project is licensed with the Mozilla Public License v2.

In practice, you can use this library as-is, with a notification of it being used. If you make any changes, you are required to publish your changes under a compatible license.

Contributing

Branch status:

Production Development
master inline-3.0

You can contribute to this library by creating a pull request.

storage-chooser's People

Contributors

beatbrot avatar codekidx avatar fennifith avatar johrpan avatar mfonville avatar mwarning avatar theandroidmaster avatar tolriq avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

storage-chooser's Issues

Support for Instant Run

Great library, but would you consider adding support for Instant Run?

I'm unable to use your library when Instant Run is enabled and receive an error message like "Immutable jar com.codeKidx..... found" on attempted launch.

I can provide more detail if you need it. Thanks so much.

Reduce minSdkVersion to API 9

This will probably require some slightly more significant changes to how the library works instead of just modifying the layout files. When tested on 10, I got a NullPonterException at ChooserDialogFragment.populateList(ChooserDialogFragment.java:261). This could be for a few different reasons, but I'll look at it more closely later this week.

Issue: android.view.InflateException: Binary XML file line #17: Error inflating class TextView

When including the storage-chooser library in my app, Google Play gives the following error during its pre-launch test on various devices. The Samsung S6 on Android 5.1 produces the following stack trace:

FATAL EXCEPTION: main
Process: com.mobiltal.geoohLive, PID: 24193
android.view.InflateException: Binary XML file line #17: Error inflating class TextView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:770)
at android.view.LayoutInflater.inflate(LayoutInflater.java:483)
at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
at android.view.LayoutInflater.inflate(LayoutInflater.java:366)
at android.widget.Editor.showError(Editor.java:433)
at android.widget.Editor.setError(Editor.java:474)
at android.widget.TextView.setError(TextView.java:5542)
at android.widget.TextView.setError(TextView.java:5527)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.validateFolderName(SecondaryChooserFragment.java:525)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.access$600(SecondaryChooserFragment.java:49)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment$5.onClick(SecondaryChooserFragment.java:130)
at android.view.View.performClick(View.java:5254)
at android.view.View$PerformClick.run(View.java:21173)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6837)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Caused by: java.lang.RuntimeException: Failed to resolve attribute at index 24
at android.content.res.TypedArray.getColor(TypedArray.java:403)
at android.widget.TextView.(TextView.java:1105)
at android.widget.TextView.(TextView.java:1017)
at android.support.v7.widget.AppCompatTextView.(AppCompatTextView.java:62)
at android.support.v7.widget.AppCompatTextView.(AppCompatTextView.java:58)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:103)
at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1029)
at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1087)
at android.support.v4.view.LayoutInflaterCompatHC$FactoryWrapperHC.onCreateView(LayoutInflaterCompatHC.java:47)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:732)
... 20 more

Fatal Exception: java.lang.IllegalArgumentException: Invalid path: /storage/container

One of my users causes this error when I use your library :

Link : http://crashes.to/s/50412a88afe

Fatal Exception: java.lang.IllegalArgumentException: Invalid path: /storage/container at android.os.StatFs.doStat(StatFs.java:46) at android.os.StatFs.(StatFs.java) at com.codekidlabs.storagechooser.utils.MemoryUtil.getTotalMemorySize(MemoryUtil.java:71) at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.populateList(ChooserDialogFragment.java:237) at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.initListView(ChooserDialogFragment.java:98) at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.getLayout(ChooserDialogFragment.java:81) at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.onCreateDialog(ChooserDialogFragment.java:250) at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) at android.app.BackStackRecord.run(BackStackRecord.java:684) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1453) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5679) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) at dalvik.system.NativeStart.main(NativeStart.java) Caused by libcore.io.ErrnoException: statvfs failed: EACCES (Permission denied) at libcore.io.Posix.statvfs(Posix.java) at libcore.io.ForwardingOs.statvfs(ForwardingOs.java:132) at android.os.StatFs.doStat(StatFs.java:44) at android.os.StatFs.(StatFs.java) at com.codekidlabs.storagechooser.utils.MemoryUtil.getTotalMemorySize(MemoryUtil.java:71) at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.populateList(ChooserDialogFragment.java:237) at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.initListView(ChooserDialogFragment.java:98) at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.getLayout(ChooserDialogFragment.java:81) at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.onCreateDialog(ChooserDialogFragment.java:250) at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) at android.app.BackStackRecord.run(BackStackRecord.java:684) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1453) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5679) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) at dalvik.system.NativeStart.main(NativeStart.java)

Issue: android.view.InflateException: Error inflating class at.markushi.ui.CircleButton

[Running on API 19 MiUI v8]
It happens right after the user chooses a storage.

FATAL EXCEPTION: main
android.view.InflateException: Binary XML file line #150: Error inflating class at.markushi.ui.CircleButton
at android.view.LayoutInflater.createView(LayoutInflater.java:623)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:699)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
at android.view.LayoutInflater.inflate(LayoutInflater.java:495)
at android.view.LayoutInflater.inflate(LayoutInflater.java:400)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:358)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:698)
at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:690)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1449)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5113)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:597)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:699) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:495) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:400) 
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:358) 
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:698) 
at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398) 
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
at android.app.BackStackRecord.run(BackStackRecord.java:690) 
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1449) 
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
at android.os.Handler.handleCallback(Handler.java:733) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5113) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 
at dalvik.system.NativeStart.main(Native Method) 

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/check.xml from drawable resource ID #0x7f02005c
at android.content.res.Resources.loadDrawable(Resources.java:2139)
at android.content.res.MiuiResources.loadDrawable(MiuiResources.java:393)
at android.content.res.Resources.loadDrawable(Resources.java:2062)
at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
at android.widget.ImageView.(ImageView.java:129)
at android.widget.ImageView.(ImageView.java:119)
at at.markushi.ui.CircleButton.(CircleButton.java:43)
at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
at android.view.LayoutInflater.createView(LayoutInflater.java:597) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:699) 
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:358) 
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:698) 
at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398) 

Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:935)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:879)
at android.content.res.Resources.createFromXml(Resources.java:2515)
at android.content.res.Resources.loadDrawable(Resources.java:2135)
at android.content.res.MiuiResources.loadDrawable(MiuiResources.java:393) 
at android.content.res.Resources.loadDrawable(Resources.java:2062) 
at android.content.res.TypedArray.getDrawable(TypedArray.java:602) 
at android.widget.ImageView.(ImageView.java:129) 
at android.widget.ImageView.(ImageView.java:119) 
at at.markushi.ui.CircleButton.(CircleButton.java:43) 
at java.lang.reflect.Constructor.constructNative(Native Method) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
at android.view.LayoutInflater.createView(LayoutInflater.java:597) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:699) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:495) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:400) 
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:358) 
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:698) 
at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398) 
android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
at android.os.Handler.handleCallback(Handler.java:733) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5113) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 
at dalvik.system.NativeStart.main(Native Method) 

IndexOutOfBoundsException exception thrown

While testing it out in my app, I navigated to an internal storage folder, created a new folder and then attempted to navigate to that folder. At that moment it throws IndexOutOfBoundsException.

06-14 22:39:08.242 3521-3521/com.blitterhead.ampwifi E/AndroidRuntime: FATAL EXCEPTION: main Process: com.blitterhead.ampwifi, PID: 3521 java.lang.IndexOutOfBoundsException: Index: 1, Size: 0 at java.util.ArrayList.get(ArrayList.java:411) at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment$7$1.run(SecondaryChooserFragment.java:365) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

I built the storage chooser as follows:
StorageChooser chooser = new StorageChooser.Builder() .withActivity(SettingsFragmentMisc.this.getActivity()) .withFragmentManager(getFragmentManager()) .withMemoryBar(true) .allowCustomPath(true) .allowAddFolder(true) .setType(StorageChooser.DIRECTORY_CHOOSER) .build();

I'm able to select folders fine as long as they are not created in that session. So when I re-ran the app and navigated back to where I created the new folder, I was able to select the new folder and everything worked fine. So, to be clear, the folder does get created fine, I just can't select it the first time through.

Here's how I added the dependency to storagechooser:
compile 'com.github.codekidX:storage-chooser:1.0.35'

java.lang.IllegalArgumentException Caused by: libcore.io.ErrnoException

`java.lang.IllegalArgumentException:
at android.os.StatFs.doStat (StatFs.java:46)
at android.os.StatFs. (StatFs.java:39)
at com.codekidlabs.storagechooser.utils.MemoryUtil.getTotalMemorySize (MemoryUtil.java:71)
at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.populateList (ChooserDialogFragment.java:252)
at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.initListView (ChooserDialogFragment.java:107)
at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.getLayout (ChooserDialogFragment.java:86)
at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.onCreateDialog (ChooserDialogFragment.java:265)
at android.app.DialogFragment.getLayoutInflater (DialogFragment.java:398)
at android.app.FragmentManagerImpl.moveToState (FragmentManagerImpl.java:890)
at android.app.FragmentManagerImpl.moveToState (FragmentManagerImpl.java:1062)
at android.app.BackStackRecord.run (BackStackRecord.java:684)
at android.app.FragmentManagerImpl.execPendingActions (FragmentManagerImpl.java:1453)
at android.app.FragmentManagerImpl$1.run (FragmentManagerImpl.java:443)
at android.os.Handler.handleCallback (Handler.java:733)
at android.os.Handler.dispatchMessage (Handler.java:95)
at android.os.Looper.loop (Looper.java:146)
at android.app.ActivityThread.main (ActivityThread.java:5487)
at java.lang.reflect.Method.invokeNative (Method.java)
at java.lang.reflect.Method.invoke (Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1099)
at dalvik.system.NativeStart.main (NativeStart.java)

Caused by: libcore.io.ErrnoException:
at libcore.io.Posix.statvfs (Posix.java)
at libcore.io.ForwardingOs.statvfs (ForwardingOs.java:132)
at android.os.StatFs.doStat (StatFs.java:44)`

AndroidRuntime: FATAL EXCEPTION:

Its throws exception after i select internal / external storage in my Samsung SM-G360H
Android version 4.4.4 please fix this ASAP

FATAL EXCEPTION: main

                                                             android.view.InflateException: Binary XML file line #85: Error inflating class <unknown>
                                                                 at android.view.LayoutInflater.createView(LayoutInflater.java:627)
                                                                 at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
                                                                 at android.view.LayoutInflater.onCreateView(LayoutInflater.java:676)
                                                                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:701)
                                                                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:762)
                                                                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:771)
                                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:499)
                                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
                                                                 at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:329)
                                                                 at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:693)
                                                                 at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398)
                                                                 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
                                                                 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
                                                                 at android.app.BackStackRecord.run(BackStackRecord.java:684)
                                                                 at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
                                                                 at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
                                                                 at android.os.Handler.handleCallback(Handler.java:733)
                                                                 at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                 at android.os.Looper.loop(Looper.java:136)
                                                                 at android.app.ActivityThread.main(ActivityThread.java:5433)
                                                                 at java.lang.reflect.Method.invokeNative(Native Method)
                                                                 at java.lang.reflect.Method.invoke(Method.java:515)
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
                                                                 at dalvik.system.NativeStart.main(Native Method)
                                                              Caused by: java.lang.reflect.InvocationTargetException
                                                                 at java.lang.reflect.Constructor.constructNative(Native Method)
                                                                 at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
                                                                 at android.view.LayoutInflater.createView(LayoutInflater.java:601)
                                                                 at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
                                                                 at android.view.LayoutInflater.onCreateView(LayoutInflater.java:676) 
                                                                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:701) 
                                                                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:762) 
                                                                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:771) 
                                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:499) 
                                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
                                                                 at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:329) 
                                                                 at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:693) 
                                                                 at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398) 
                                                                 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 
                                                                 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
                                                                 at android.app.BackStackRecord.run(BackStackRecord.java:684) 
                                                                 at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 
                                                                 at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
                                                                 at android.os.Handler.handleCallback(Handler.java:733) 
                                                                 at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                 at android.os.Looper.loop(Looper.java:136) 
                                                                 at android.app.ActivityThread.main(ActivityThread.java:5433) 
                                                                 at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                 at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
                                                                 at dalvik.system.NativeStart.main(Native Method) 
                                                              Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x1/d=0x7f0200ee a=-1 r=0x7f0200ee}
                                                                 at android.content.res.Resources.loadDrawable(Resources.java:3423)
                                                                 at android.content.res.TypedArray.getDrawable(TypedArray.java:614)
                                                                 at android.widget.AbsListView.<init>(AbsListView.java:834)
                                                                 at android.widget.ListView.<init>(ListView.java:152)
                                                                 at android.widget.ListView.<init>(ListView.java:148)
                                                                 at java.lang.reflect.Constructor.constructNative(Native Method) 
                                                                 at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
                                                                 at android.view.LayoutInflater.createView(LayoutInflater.java:601) 
                                                                 at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
                                                                 at android.view.LayoutInflater.onCreateView(LayoutInflater.java:676) 
                                                                 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:701) 
                                                                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:762) 
                                                                 at android.view.LayoutInflater.rInflate(LayoutInflater.java:771) 
                                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:499) 
                                                                 at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
                                                                 at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:329) 
                                                                 at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:693) 
                                                                 at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398) 
                                                                 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 
                                                                 at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
                                                                 at android.app.BackStackRecord.run(BackStackRecord.java:684) 
                                                                 at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 
                                                                 at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
                                                                 at android.os.Handler.handleCallback(Handler.java:733) 
                                                                 at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                 at android.os.Looper.loop(Looper.java:136) 
                                                                 at android.app.ActivityThread.main(ActivityThread.java:5433) 
                                                                 at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                 at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
                                                                 at dalvik.system.NativeStart.main(Native Method) 

App crash when opening on emulator API 19

android.view.InflateException: Binary XML file line #0: Error inflating class android.widget.ListView
   at android.view.LayoutInflater.createView(LayoutInflater.java:621)
   at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:670)
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:695)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:756)
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:759)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
   at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
   at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:329)
   at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:693)
   at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398)
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
   at android.app.BackStackRecord.run(BackStackRecord.java:684)
   at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
   at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
   at android.os.Handler.handleCallback(Handler.java:733)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:136)
   at android.app.ActivityThread.main(ActivityThread.java:5017)
   at java.lang.reflect.Method.invokeNative(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
   at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
   at java.lang.reflect.Constructor.constructNative(Native Method)
   at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
   at android.view.LayoutInflater.createView(LayoutInflater.java:595)
   at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:670) 
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:695) 
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:756) 
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:759) 
   at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
   at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
   at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:329) 
   at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:693) 
   at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398) 
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
   at android.app.BackStackRecord.run(BackStackRecord.java:684) 
   at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 
   at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
   at android.os.Handler.handleCallback(Handler.java:733) 
   at android.os.Handler.dispatchMessage(Handler.java:95) 
   at android.os.Looper.loop(Looper.java:136) 
   at android.app.ActivityThread.main(ActivityThread.java:5017) 
   at java.lang.reflect.Method.invokeNative(Native Method) 
   at java.lang.reflect.Method.invoke(Method.java:515) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
   at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x1/d=0x7f0800c3 a=-1 r=0x7f0800c3}
   at android.content.res.Resources.loadDrawable(Resources.java:2073)
   at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
   at android.widget.AbsListView.<init>(AbsListView.java:785)
   at android.widget.ListView.<init>(ListView.java:146)
   at android.widget.ListView.<init>(ListView.java:142)
   at java.lang.reflect.Constructor.constructNative(Native Method) 
   at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
   at android.view.LayoutInflater.createView(LayoutInflater.java:595) 
   at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
   at android.view.LayoutInflater.onCreateView(LayoutInflater.java:670) 
   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:695) 
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:756) 
   at android.view.LayoutInflater.rInflate(LayoutInflater.java:759) 
   at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
   at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
   at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:329) 
   at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:693) 
   at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398) 
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 
   at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 
   at android.app.BackStackRecord.run(BackStackRecord.java:684) 
   at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 
   at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) 
   at android.os.Handler.handleCallback(Handler.java:733) 
   at android.os.Handler.dispatchMessage(Handler.java:95) 
   at android.os.Looper.loop(Looper.java:136) 
   at android.app.ActivityThread.main(ActivityThread.java:5017) 
   at java.lang.reflect.Method.invokeNative(Native Method) 
   at java.lang.reflect.Method.invoke(Method.java:515) 
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
   at dalvik.system.NativeStart.main(Native Method) 

That happens when I open chooser like this:

StorageChooser testChooser = new StorageChooser.Builder()
                .withActivity(getActivity())
                .withFragmentManager(getActivity().getFragmentManager())
                .skipOverview(true, getContext().getSharedPreferences("default", Context.MODE_PRIVATE).getString(PREFERENCE_TESTS_FOLDER, null))
                .filter(StorageChooser.FileType.DOCS)
                .allowCustomPath(true)
                .setType(FILE_PICKER)
                .disableMultiSelect()
                .build();

My guess is it has something to do with custom_storage_list.xml, which contains this ListView

<ListView
            android:id="@+id/storage_list_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@id/select_button"
            android:layout_below="@id/custom_path_header"
            android:divider="@null"
            android:listSelector="@drawable/ripple"
            android:longClickable="true" />

ripple.xml is in drawable-v21 folder and contains <ripple> tag, which appeared in API 21. I'm going to try and fix it myself now

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

The error happened when I rotate device with open dialog "Choose storage" and pick any storage.
Chooser configuration
new StorageChooser.Builder() .withActivity(this) .withFragmentManager(getFragmentManager()) .withMemoryBar(true) .allowCustomPath(true) .setType(StorageChooser.FILE_PICKER) .shouldResumeSession(false) .build();
Also if choose storage and rotate device I see next
image

Full error:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1328) at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1346) at android.app.BackStackRecord.commitInternal(BackStackRecord.java:729) at android.app.BackStackRecord.commit(BackStackRecord.java:705) at android.app.DialogFragment.show(DialogFragment.java:230) at com.codekidlabs.storagechooser.utils.DiskUtil.showSecondaryChooser(DiskUtil.java:67) at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment$1$1.run(ChooserDialogFragment.java:130) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

root required?

How is this being done without ACTION_OPEN_DOCUMENT_TREE and UriPermission? Is root required?

Does this work on external SD card?

I'm currently using SAF using Intent OPEN_CONTENT to get writeable uri permissions on an external SD card before I can write files to it. Will this library help me avoid writing a lot of code to use writeable uri permissions? Would appreciate a quick reply.

Use mime types for filters

It would be more flexible to have an API to allow input of a list of mime types for the filter instead of the predefined ones. For example, I just want to filter for '*.txt' files, but with the current implementation that is not possible.

Is it possible to make .withFragmentManager() accept the supportFragmentManager?

I'm trying to call StorageChooser from a fragment.
If the fragment Class extends android.support.v4.app.Fragment, getFragmentManager() will of course return android.support.v4.app.FragmentManager and therefore .withFragmentManager(getFragmentManager()) will not let me do that as it currently only accepts android.app.FragmentManager as parameter.

Is there another way to do it?

PS. I made the fragment extend android.app.Fragment, it works but whenever I switch to this fragment, the other ones (that use support fragment) are not getting shut down, the same happens in the reverse way. Also, they keep visible, like this

selecting a file in /emulated/0/download folder

Same issue when just trying to select a file on Genymotion AND My LG V20 actual device after selecting a file in /emulated/0/download folder

java.lang.NullPointerException: Attempt to invoke interface method 'void com.codekidlabs.storagechooser.StorageChooser$OnSelectListener.onSelect(java.lang.String)' on a null object reference at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment$7$1.run(SecondaryChooserFragment.java:369) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

java.lang.RuntimeException: Unable to start activity

crashes if open dialog and lost activity

FATAL EXCEPTION: main
java.lang.RuntimeException: 
Unable to start activity ComponentInfo{***}: 
java.lang.NullPointerException: 
Attempt to invoke virtual method 'void android.app.Dialog.setContentView(android.view.View)' on a null object reference
                                                   

and missed trigger to force close dialog...

Add possibility to change filePath text color

Hi,
I have yellow "colorPrimary" and the white text color on the filePath is hard to read. I would like to change it to black. Is this possible and if not, it would be a great enhancement.

Backport New Folder Icon Animation to API 16 (and below...)

Vector Animations are only useful if you're actually changing the shape of the vector drawable's path (such as a morph animation or a visibility strike). Using a regular drawable animation could fix this, or we could be super lazy and rotate the ImageView 45 degrees programatically instead ;)

Usage in a fragment?

Is there a way to get this to work in a fragment? I'm experiencing crashes because of this error:

'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()'

any help would be great.

Image thumbnails

I think it would be a good improvement to add an option to show image files' thumbnails instead of type icon.

Padding chooser heading

When I translate the chooser heading with the static class, there is no padding. It's on this textView R.id. dialog_title in this layout R.layout.storage_list.

The translate sentence is "Choisissez l'emplacement de stockage" if you want to test

Not able to select subfolders

I'm able to see single dialog where internal memory or external memory option showing. when i clicked on anyone, dialog dismiss.
i tried with chossertype filepicker as well as directory picker

Gradle : Failed to resolve

I added below to app level gradle and it throws error after sync gradle.

compile 'com.github.codekidX:storage-chooser:1.0.33'

Error:(71, 13) Failed to resolve: com.github.codekidX:storage-chooser:1.0.33

Files may appear when choosing folders

Under certain conditions, file names appears even though the type is set to StorageChooser.DIRECTORY_CHOOSER. Steps to repro:

  1. Open the Storage Chooser with the type set to DIRECTORY_CHOOSER
  2. Navigate to a folder where you know other files exist (you won't see them yet)
  3. Create a new folder, any name
  4. Once the folder is created, you see all the files in that folder.

See the linked video:
YouTube

MPL 2.0 notice

I want to use this library on my commercial android app.
Where to put noticement in my application for legal use?

not all config optoins applied

file: ChooserDialogFragment.java need changes:

private View getLayout(LayoutInflater inflater, ViewGroup container) {
private View getLayout(LayoutInflater inflater, ViewGroup container) {
		mConfig = StorageChooser.getsConfig();
		mLayout = inflater.inflate(R.layout.storage_list, container, false);
		initListView(getContext(), mLayout, mConfig.isShowMemoryBar());

		if (mConfig.getDialogTitle() != null) {
			TextView dialogTitle = (TextView) mLayout.findViewById(R.id.dialog_title);
			dialogTitle.setText(mConfig.getDialogTitle());
		}

		return mLayout;
	}
...
// just add the internal storage and avoid adding emulated henceforth
if (mConfig.getInternalStorageText() != null) {
			storages.setStorageTitle(mConfig.getInternalStorageText());
		} else {
			storages.setStorageTitle(INTERNAL_STORAGE_TITLE);
		}

List blinks after opening a storage

See the video
https://www.dropbox.com/s/4ts52h6maixfasg/mobizen_20170310_202223.mp4?dl=1

Code in Fragment:

public class MyFragment extends android.support.v4.app.Fragment{
...
StorageChooser chooser = new StorageChooser.Builder()
                .withActivity(getActivity())
                .withFragmentManager(getChildFragmentManager())
                .withPredefinedPath(Environment.getExternalStorageState())
                .setType(StorageChooser.DIRECTORY_CHOOSER)
                .applyMemoryThreshold(false)
                .allowCustomPath(true)
                .build();

        chooser.setOnSelectListener(new StorageChooser.OnSelectListener() {
            @Override
            public void onSelect(String path) {
                handleDirectoryChoice(path);
            }
        });
        chooser.show();
...

1.0.33 -> 1.0.34

please update dependency in readme to 1.0.34:

com.github.codekidX:storage-chooser:1.0.33

KitKat crash

KitKat devices (4.4.2 & 4.4.4) are crashing.
Version used: 2.0.2

Fatal Exception: android.view.InflateException: Binary XML file line #150: Error inflating class at.markushi.ui.CircleButton
at android.view.LayoutInflater.createView(LayoutInflater.java:620)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:358)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:709)
at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:698)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5377)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:649)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Constructor.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:594)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:358)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:709)
at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:698)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5377)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:649)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by android.content.res.Resources$NotFoundException: File res/drawable/check.xml from drawable resource ID #0x7f02005c
at android.content.res.Resources.loadDrawable(Resources.java:2222)
at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
at android.widget.ImageView.(ImageView.java:129)
at android.widget.ImageView.(ImageView.java:119)
at at.markushi.ui.CircleButton.(CircleButton.java:43)
at java.lang.reflect.Constructor.constructNative(Constructor.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:594)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:358)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:709)
at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:698)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5377)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:649)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:933)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)
at android.content.res.Resources.loadDrawable(Resources.java:2218)
at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
at android.widget.ImageView.(ImageView.java:129)
at android.widget.ImageView.(ImageView.java:119)
at at.markushi.ui.CircleButton.(CircleButton.java:43)
at java.lang.reflect.Constructor.constructNative(Constructor.java)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at android.view.LayoutInflater.createView(LayoutInflater.java:594)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:758)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.getLayout(SecondaryChooserFragment.java:358)
at com.codekidlabs.storagechooser.fragments.SecondaryChooserFragment.onCreateDialog(SecondaryChooserFragment.java:709)
at android.app.DialogFragment.getLayoutInflater(DialogFragment.java:398)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062)
at android.app.BackStackRecord.run(BackStackRecord.java:698)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5377)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:649)
at dalvik.system.NativeStart.main(NativeStart.java)

How do I enable folder creation?

I'm following the readme to build a directory chooser, but I seem to be missing the "+" from the screenshots to create folders - how do I enable that ?

StorageChooser chooser = new StorageChooser.Builder()
.withActivity(this.getActivity())
.withFragmentManager(this.getFragmentManager())
.withMemoryBar(true)
.allowCustomPath(true)
.setType(StorageChooser.DIRECTORY_CHOOSER)
.build();

The Storage you have chosen is not accessible. Message shown...

1 One of My Mobile Phone of Internal Storage shown in the dialog when i click on that the Message shows The Storage you have chosen is not accessible.My phone configuration is

DEVICE
Device YUNICORN (YUNICORN) Manufacturer YU Device type Phone Device language English CPU make Mediatek CPU model MT6755M Native platform armeabi-v7a, armeabi, arm64-v8a RAM (MB) 4096 Screen size 1080 × 1920 Screen density (DPI) 480 OpenGL ES version 3.0 OS Android 6.0

2 i have also one question can we access usb drive from your storage chooser app i really need usb drive pl help me i am connecting usb drive using otg cable to the android device. as like path given by storage chooser app for storages can usb give that type of path or give me some link for reference.

Theming the dialog?

For some reason the dialog is not following my apps theme. Is there a special way to theme the dialog?

OnCancelListener is never triggered when cancelling from overview

I enable the overview so that the user can select different storage areas. However, if they tap the back button to cancel the onCancel() callback is never triggered. It works fine once they select their storage area and see the list of folders and THEN hit the back button to cancel. I think the onCancel() should be triggered from the overview as well.

Also, as a bonus, I'd suggest adding the option to skip the overview if the device only has internal storage but to show it if there are other storage areas. Basically, only force the user to choose where there are options to choose from.

While creating a new folder, you can enter line feeds while entering a folder name

image

As the screenshot above demonstrates, while entering a folder name in the create box, you can enter multiple line feeds. Hitting the create button results in an error, which I guess is ok, but the user should not be allowed to enter a line feed.

This can be done easily on the soft keyboard by calling setImeOptions(EditorInfo.IME_ACTION_DONE). However, you'll also need to filter out line feeds (and any other funny characters that may not be appropriate for a folder name) using a filter as user may use a real keyboard. And also, maybe set the maxLines to 1 in case someone copies and pastes multiple lines.

App crashes by no view found exception

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.atlasso/droidninja.filepicker.FilePickerActivity}: java.lang.IllegalArgumentException: No view found for id 0x7f100125 (com.atlasso:id/container) for fragment MediaPickerFragment{37d7bfb #0 id=0x7f100125 MediaPickerFragment}
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2607)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2701)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1491)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5789)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:739)
Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f100125 (com.atlasso:id/container) for fragment MediaPickerFragment{37d7bfb #0 id=0x7f100125 MediaPickerFragment}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1413)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3221)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3171)
at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:192)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:560)
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1245)
at android.app.Activity.performStart(Activity.java:6286)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2555)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2701) 
at android.app.ActivityThread.-wrap11(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1491) 
at android.os.Handler.dispatchMessage(Handler.java:111) 
at android.os.Looper.loop(Looper.java:207) 
at android.app.ActivityThread.main(ActivityThread.java:5789) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:739) 

ErrnoException: statvfs failed: ENOENT (No such file or directory)

Used only to Select Storage

Logs from Crashlytics

statvfs failed: ENOENT (No such file or directory)

com.codekidlabs.storagechooser.utils.MemoryUtil.getTotalMemorySize (MemoryUtil.java:71)
com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.populateList (ChooserDialogFragment.java:255)
com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.initListView (ChooserDialogFragment.java:114)
com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.getLayout (ChooserDialogFragment.java:84)
com.codekidlabs.storagechooser.fragments.ChooserDialogFragment.onCreateDialog (ChooserDialogFragment.java:298)

Possibility to change textColor

Hi,
I am using Theme.AppCompat in my app and the StorageChooser Dialog has white text on white background. I did not find any way to change the text color. Is this possible and if not, it would be a great enhancement.

White screen and stuck in ColorOS

In the OPPO phone ColorOS above can not click, the dialog box white screen, stuck, can only be forced to stop.
(This is my user feedback, I do not have ColorOS)
Screenshot
Hope you try to fix it, thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.