From bec6d113731e4659c1b90b822b96e1e6a6a00d7f Mon Sep 17 00:00:00 2001 From: Veselin Penev Date: Sun, 21 Jun 2020 17:39:09 +0200 Subject: [PATCH] added --activity-class-name parameters and make possible to use custom PythonActivity java class --- pythonforandroid/build.py | 2 ++ pythonforandroid/recipes/android/__init__.py | 2 ++ .../recipes/android/src/android/_android.pyx | 4 ++-- .../recipes/android/src/android/activity.py | 8 ++++---- .../recipes/android/src/android/broadcast.py | 4 ++-- .../recipes/android/src/android/loadingscreen.py | 4 +++- .../recipes/android/src/android/permissions.py | 11 +++++++---- .../recipes/android/src/android/runnable.py | 4 ++-- .../recipes/android/src/android/storage.py | 6 ++++-- pythonforandroid/toolchain.py | 7 +++++++ tests/test_toolchain.py | 1 + 11 files changed, 36 insertions(+), 17 deletions(-) diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index 9bed914d95..72198a52df 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -447,6 +447,8 @@ def __init__(self): self.local_recipes = None self.copy_libs = False + self.activity_class_name = u'org.kivy.android.PythonActivity' + # this list should contain all Archs, it is pruned later self.archs = ( ArchARM(self), diff --git a/pythonforandroid/recipes/android/__init__.py b/pythonforandroid/recipes/android/__init__.py index ba45fe95b1..01b0c92371 100644 --- a/pythonforandroid/recipes/android/__init__.py +++ b/pythonforandroid/recipes/android/__init__.py @@ -51,6 +51,8 @@ def prebuild_arch(self, arch): 'PY2': 0, 'JAVA_NAMESPACE': java_ns, 'JNI_NAMESPACE': jni_ns, + 'ACTIVITY_CLASS_NAME': self.ctx.activity_class_name, + 'ACTIVITY_CLASS_NAMESPACE': self.ctx.activity_class_name.replace('.', '/'), } # create config files for Cython, C and Python diff --git a/pythonforandroid/recipes/android/src/android/_android.pyx b/pythonforandroid/recipes/android/src/android/_android.pyx index bdca2df454..9acce789e1 100644 --- a/pythonforandroid/recipes/android/src/android/_android.pyx +++ b/pythonforandroid/recipes/android/src/android/_android.pyx @@ -159,7 +159,7 @@ api_version = autoclass('android.os.Build$VERSION').SDK_INT version_codes = autoclass('android.os.Build$VERSION_CODES') -python_act = autoclass(JAVA_NAMESPACE + u'.PythonActivity') +python_act = autoclass(ACTIVITY_PACKAGE + u'.' + ACTIVITY_CLASS_NAME) Rect = autoclass(u'android.graphics.Rect') mActivity = python_act.mActivity if mActivity: @@ -293,7 +293,7 @@ def start_service(title="Background Service", arg = "" # Start service: - mActivity = autoclass('org.kivy.android.PythonActivity').mActivity + mActivity = autoclass(ACTIVITY_PACKAGE + '.' + ACTIVITY_CLASS_NAME).mActivity if as_foreground: mActivity.start_service( title, description, arg diff --git a/pythonforandroid/recipes/android/src/android/activity.py b/pythonforandroid/recipes/android/src/android/activity.py index 9c215075c6..4e1581bbea 100644 --- a/pythonforandroid/recipes/android/src/android/activity.py +++ b/pythonforandroid/recipes/android/src/android/activity.py @@ -1,7 +1,7 @@ from jnius import PythonJavaClass, autoclass, java_method -from android.config import JAVA_NAMESPACE, JNI_NAMESPACE +from android.config import ACTIVITY_CLASS_NAME, ACTIVITY_CLASS_NAMESPACE -_activity = autoclass(JAVA_NAMESPACE + '.PythonActivity').mActivity +_activity = autoclass(ACTIVITY_CLASS_NAME).mActivity _callbacks = { 'on_new_intent': [], @@ -10,7 +10,7 @@ class NewIntentListener(PythonJavaClass): - __javainterfaces__ = [JNI_NAMESPACE + '/PythonActivity$NewIntentListener'] + __javainterfaces__ = [ACTIVITY_CLASS_NAMESPACE + '$NewIntentListener'] __javacontext__ = 'app' def __init__(self, callback, **kwargs): @@ -23,7 +23,7 @@ def onNewIntent(self, intent): class ActivityResultListener(PythonJavaClass): - __javainterfaces__ = [JNI_NAMESPACE + '/PythonActivity$ActivityResultListener'] + __javainterfaces__ = [ACTIVITY_CLASS_NAMESPACE + '$ActivityResultListener'] __javacontext__ = 'app' def __init__(self, callback): diff --git a/pythonforandroid/recipes/android/src/android/broadcast.py b/pythonforandroid/recipes/android/src/android/broadcast.py index aa454b7c13..0910c78f60 100644 --- a/pythonforandroid/recipes/android/src/android/broadcast.py +++ b/pythonforandroid/recipes/android/src/android/broadcast.py @@ -2,7 +2,7 @@ # Broadcast receiver bridge from jnius import autoclass, PythonJavaClass, java_method -from android.config import JAVA_NAMESPACE, JNI_NAMESPACE +from android.config import JAVA_NAMESPACE, JNI_NAMESPACE, ACTIVITY_CLASS_NAME class BroadcastReceiver(object): @@ -74,5 +74,5 @@ def context(self): if 'PYTHON_SERVICE_ARGUMENT' in environ: PythonService = autoclass(JAVA_NAMESPACE + '.PythonService') return PythonService.mService - PythonActivity = autoclass(JAVA_NAMESPACE + '.PythonActivity') + PythonActivity = autoclass(ACTIVITY_CLASS_NAME) return PythonActivity.mActivity diff --git a/pythonforandroid/recipes/android/src/android/loadingscreen.py b/pythonforandroid/recipes/android/src/android/loadingscreen.py index 1dc1b670f5..962aa5c719 100644 --- a/pythonforandroid/recipes/android/src/android/loadingscreen.py +++ b/pythonforandroid/recipes/android/src/android/loadingscreen.py @@ -1,7 +1,9 @@ from jnius import autoclass +from android.config import ACTIVITY_CLASS_NAME + def hide_loading_screen(): - python_activity = autoclass('org.kivy.android.PythonActivity') + python_activity = autoclass(ACTIVITY_CLASS_NAME) python_activity.removeLoadingScreen() diff --git a/pythonforandroid/recipes/android/src/android/permissions.py b/pythonforandroid/recipes/android/src/android/permissions.py index 963f48454f..17d2a27902 100644 --- a/pythonforandroid/recipes/android/src/android/permissions.py +++ b/pythonforandroid/recipes/android/src/android/permissions.py @@ -9,6 +9,9 @@ def autoclass(item): raise RuntimeError("pyjnius not available") +from android.config import ACTIVITY_CLASS_NAME, ACTIVITY_CLASS_NAMESPACE + + class Permission: ACCEPT_HANDOVER = "android.permission.ACCEPT_HANDOVER" ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION" @@ -431,7 +434,7 @@ class _onRequestPermissionsCallback(PythonJavaClass): """Callback class for registering a Python callback from onRequestPermissionsResult in PythonActivity. """ - __javainterfaces__ = ['org.kivy.android.PythonActivity$PermissionsCallback'] + __javainterfaces__ = [ACTIVITY_CLASS_NAMESPACE + '$PermissionsCallback'] __javacontext__ = 'app' def __init__(self, func): @@ -484,7 +487,7 @@ class _RequestPermissionsManager: def register_callback(cls): """Register Java callback for requestPermissions.""" cls._java_callback = _onRequestPermissionsCallback(cls.python_callback) - python_activity = autoclass('org.kivy.android.PythonActivity') + python_activity = autoclass(ACTIVITY_CLASS_NAME) python_activity.addPermissionsCallback(cls._java_callback) @classmethod @@ -508,7 +511,7 @@ def request_permissions(cls, permissions, callback=None): with cls._lock: if not cls._java_callback: cls.register_callback() - python_activity = autoclass('org.kivy.android.PythonActivity') + python_activity = autoclass(ACTIVITY_CLASS_NAME) if not callback: python_activity.requestPermissions(permissions) else: @@ -583,7 +586,7 @@ def check_permission(permission): Returns: bool: True if the app holds the permission given, False otherwise. """ - python_activity = autoclass('org.kivy.android.PythonActivity') + python_activity = autoclass(ACTIVITY_CLASS_NAME) result = bool(python_activity.checkCurrentPermission( permission + "" )) diff --git a/pythonforandroid/recipes/android/src/android/runnable.py b/pythonforandroid/recipes/android/src/android/runnable.py index 74268c803f..b20f6cc3f7 100644 --- a/pythonforandroid/recipes/android/src/android/runnable.py +++ b/pythonforandroid/recipes/android/src/android/runnable.py @@ -4,10 +4,10 @@ ''' from jnius import PythonJavaClass, java_method, autoclass -from android.config import JAVA_NAMESPACE +from android.config import ACTIVITY_CLASS_NAME # Reference to the activity -_PythonActivity = autoclass(JAVA_NAMESPACE + '.PythonActivity') +_PythonActivity = autoclass(ACTIVITY_CLASS_NAME) # Cache of functions table. In older Android versions the number of JNI references # is limited, so by caching them we avoid running out. diff --git a/pythonforandroid/recipes/android/src/android/storage.py b/pythonforandroid/recipes/android/src/android/storage.py index f4d01403bc..a7210e0ead 100644 --- a/pythonforandroid/recipes/android/src/android/storage.py +++ b/pythonforandroid/recipes/android/src/android/storage.py @@ -1,6 +1,8 @@ from jnius import autoclass, cast import os +from android.config import JAVA_NAMESPACE, ACTIVITY_CLASS_NAME + Environment = autoclass('android.os.Environment') File = autoclass('java.io.File') @@ -28,11 +30,11 @@ def _get_activity(): """ Retrieves the activity from `PythonActivity` fallback to `PythonService`. """ - PythonActivity = autoclass('org.kivy.android.PythonActivity') + PythonActivity = autoclass(ACTIVITY_CLASS_NAME) activity = PythonActivity.mActivity if activity is None: # assume we're running from the background service - PythonService = autoclass('org.kivy.android.PythonService') + PythonService = autoclass(JAVA_NAMESPACE + '.' + 'PythonService') activity = PythonService.mService return activity diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index 19b35242b2..3583fd7be2 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -376,6 +376,11 @@ def __init__(self): dest='local_recipes', default='./p4a-recipes', help='Directory to look for local recipes') + generic_parser.add_argument( + '--activity-class-name', + dest='activity_class_name', default='org.kivy.android.PythonActivity', + help='The full java class name of the main activity') + generic_parser.add_argument( '--java-build-tool', dest='java_build_tool', default='auto', @@ -704,6 +709,8 @@ def add_parser(subparsers, *args, **kwargs): self.ctx.local_recipes = args.local_recipes self.ctx.copy_libs = args.copy_libs + self.ctx.activity_class_name = args.activity_class_name + # Each subparser corresponds to a method command = args.subparser_name.replace('-', '_') getattr(self, command)(args) diff --git a/tests/test_toolchain.py b/tests/test_toolchain.py index 024fa24084..dbe65af3df 100644 --- a/tests/test_toolchain.py +++ b/tests/test_toolchain.py @@ -60,6 +60,7 @@ def test_create(self): '--bootstrap=service_only', '--requirements=python3', '--dist-name=test_toolchain', + '--activity-class-name=org0.kivy1.android2.PythonActivity3', ] with patch_sys_argv(argv), mock.patch( 'pythonforandroid.build.get_available_apis'