Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix android detection when python4android is present #277

Merged
merged 10 commits into from
May 15, 2024

Conversation

tmolitor-stud-tu
Copy link
Contributor

@tmolitor-stud-tu tmolitor-stud-tu commented Apr 28, 2024

When using platformdirs in an android app located on adopted storage, _android_folder() in android.py returned None which lead platformdirs to believe that it doesn't run on android and use the Unix flavor instead.

In android.py#L126 autoclass("android.content.Context") returns a class instead of an instance, which throws an exception on the next line trying to access an instance method named getFilesDir().

That exception is catched and a fallback implementation invoked, that uses a regular expression to search in sys.path for an import path rooted in /data. Apps installed on adopted storage don't have such paths but begin with /mnt/expand/ instead.
The regular expression therefore fails and _android_folder() returns None.

This pull request fixes the issue at least for cases where python4android is available, by first trying to import the android module and using it's mActivity export to get hold of the main activity. That activity is then used to get a proper application context upon which getFilesDir() can be invoked.

If that fails with an exception the original codepath is taken, trying the autoclassapproach next and if that fails resorting to the regular expression.

Copy link
Contributor

@gaborbernat gaborbernat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test and fix typecheker.

@tmolitor-stud-tu
Copy link
Contributor Author

done

Use the builtin mActivity of python4android to get hold of our main activity,
which is capable of generating a proper application context.
Copy link
Contributor

@gaborbernat gaborbernat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add tests 👍

@tmolitor-stud-tu
Copy link
Contributor Author

I've added a test with a mocked android import (test_android_folder_from_p4a) and I also added an adopted storage path to test_android_folder_from_sys_path and adapted the implementation to do a regex fallback for adopted storage, too.

tests/test_android.py Outdated Show resolved Hide resolved
src/platformdirs/android.py Outdated Show resolved Hide resolved
Copy link
Contributor

@gaborbernat gaborbernat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gaborbernat gaborbernat merged commit 5ec69d8 into platformdirs:main May 15, 2024
28 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants