Skip to content

Commit c61304a

Browse files
committed
added --activity-class-name parameters and make possible to use custom PythonActivity java class
1 parent 1b3b0e3 commit c61304a

File tree

11 files changed

+38
-18
lines changed

11 files changed

+38
-18
lines changed

pythonforandroid/build.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,8 @@ def __init__(self):
447447
self.local_recipes = None
448448
self.copy_libs = False
449449

450+
self.activity_class_name = u'org.kivy.android.PythonActivity'
451+
450452
# this list should contain all Archs, it is pruned later
451453
self.archs = (
452454
ArchARM(self),

pythonforandroid/recipes/android/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ def prebuild_arch(self, arch):
5151
'PY2': 0,
5252
'JAVA_NAMESPACE': java_ns,
5353
'JNI_NAMESPACE': jni_ns,
54+
'ACTIVITY_CLASS_NAME': self.ctx.activity_class_name,
55+
'ACTIVITY_CLASS_NAMESPACE': self.ctx.activity_class_name.replace('.', '/'),
5456
}
5557

5658
# create config files for Cython, C and Python

pythonforandroid/recipes/android/src/android/_android.pyx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ api_version = autoclass('android.os.Build$VERSION').SDK_INT
159159
version_codes = autoclass('android.os.Build$VERSION_CODES')
160160

161161

162-
python_act = autoclass(JAVA_NAMESPACE + u'.PythonActivity')
162+
python_act = autoclass(ACTIVITY_CLASS_NAME)
163163
Rect = autoclass(u'android.graphics.Rect')
164164
mActivity = python_act.mActivity
165165
if mActivity:
@@ -293,7 +293,7 @@ def start_service(title="Background Service",
293293
arg = ""
294294

295295
# Start service:
296-
mActivity = autoclass('org.kivy.android.PythonActivity').mActivity
296+
mActivity = autoclass(ACTIVITY_CLASS_NAME).mActivity
297297
if as_foreground:
298298
mActivity.start_service(
299299
title, description, arg

pythonforandroid/recipes/android/src/android/activity.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from jnius import PythonJavaClass, autoclass, java_method
2-
from android.config import JAVA_NAMESPACE, JNI_NAMESPACE
2+
from android.config import ACTIVITY_CLASS_NAME, ACTIVITY_CLASS_NAMESPACE
33

4-
_activity = autoclass(JAVA_NAMESPACE + '.PythonActivity').mActivity
4+
_activity = autoclass(ACTIVITY_CLASS_NAME).mActivity
55

66
_callbacks = {
77
'on_new_intent': [],
@@ -10,7 +10,7 @@
1010

1111

1212
class NewIntentListener(PythonJavaClass):
13-
__javainterfaces__ = [JNI_NAMESPACE + '/PythonActivity$NewIntentListener']
13+
__javainterfaces__ = [ACTIVITY_CLASS_NAMESPACE + '$NewIntentListener']
1414
__javacontext__ = 'app'
1515

1616
def __init__(self, callback, **kwargs):
@@ -23,7 +23,7 @@ def onNewIntent(self, intent):
2323

2424

2525
class ActivityResultListener(PythonJavaClass):
26-
__javainterfaces__ = [JNI_NAMESPACE + '/PythonActivity$ActivityResultListener']
26+
__javainterfaces__ = [ACTIVITY_CLASS_NAMESPACE + '$ActivityResultListener']
2727
__javacontext__ = 'app'
2828

2929
def __init__(self, callback):

pythonforandroid/recipes/android/src/android/broadcast.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Broadcast receiver bridge
33

44
from jnius import autoclass, PythonJavaClass, java_method
5-
from android.config import JAVA_NAMESPACE, JNI_NAMESPACE
5+
from android.config import JAVA_NAMESPACE, JNI_NAMESPACE, ACTIVITY_CLASS_NAME
66

77

88
class BroadcastReceiver(object):
@@ -74,5 +74,5 @@ def context(self):
7474
if 'PYTHON_SERVICE_ARGUMENT' in environ:
7575
PythonService = autoclass(JAVA_NAMESPACE + '.PythonService')
7676
return PythonService.mService
77-
PythonActivity = autoclass(JAVA_NAMESPACE + '.PythonActivity')
77+
PythonActivity = autoclass(ACTIVITY_CLASS_NAME)
7878
return PythonActivity.mActivity
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11

22
from jnius import autoclass
33

4+
from android.config import ACTIVITY_CLASS_NAME
5+
46

57
def hide_loading_screen():
6-
python_activity = autoclass('org.kivy.android.PythonActivity')
8+
python_activity = autoclass(ACTIVITY_CLASS_NAME)
79
python_activity.removeLoadingScreen()

pythonforandroid/recipes/android/src/android/permissions.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ def autoclass(item):
99
raise RuntimeError("pyjnius not available")
1010

1111

12+
from android.config import ACTIVITY_CLASS_NAME, ACTIVITY_CLASS_NAMESPACE
13+
14+
1215
class Permission:
1316
ACCEPT_HANDOVER = "android.permission.ACCEPT_HANDOVER"
1417
ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION"
@@ -431,7 +434,7 @@ class _onRequestPermissionsCallback(PythonJavaClass):
431434
"""Callback class for registering a Python callback from
432435
onRequestPermissionsResult in PythonActivity.
433436
"""
434-
__javainterfaces__ = ['org.kivy.android.PythonActivity$PermissionsCallback']
437+
__javainterfaces__ = [ACTIVITY_CLASS_NAMESPACE + '$PermissionsCallback']
435438
__javacontext__ = 'app'
436439

437440
def __init__(self, func):
@@ -484,7 +487,7 @@ class _RequestPermissionsManager:
484487
def register_callback(cls):
485488
"""Register Java callback for requestPermissions."""
486489
cls._java_callback = _onRequestPermissionsCallback(cls.python_callback)
487-
python_activity = autoclass('org.kivy.android.PythonActivity')
490+
python_activity = autoclass(ACTIVITY_CLASS_NAME)
488491
python_activity.addPermissionsCallback(cls._java_callback)
489492

490493
@classmethod
@@ -508,7 +511,7 @@ def request_permissions(cls, permissions, callback=None):
508511
with cls._lock:
509512
if not cls._java_callback:
510513
cls.register_callback()
511-
python_activity = autoclass('org.kivy.android.PythonActivity')
514+
python_activity = autoclass(ACTIVITY_CLASS_NAME)
512515
if not callback:
513516
python_activity.requestPermissions(permissions)
514517
else:
@@ -583,7 +586,7 @@ def check_permission(permission):
583586
Returns:
584587
bool: True if the app holds the permission given, False otherwise.
585588
"""
586-
python_activity = autoclass('org.kivy.android.PythonActivity')
589+
python_activity = autoclass(ACTIVITY_CLASS_NAME)
587590
result = bool(python_activity.checkCurrentPermission(
588591
permission + ""
589592
))

pythonforandroid/recipes/android/src/android/runnable.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
'''
55

66
from jnius import PythonJavaClass, java_method, autoclass
7-
from android.config import JAVA_NAMESPACE
7+
from android.config import ACTIVITY_CLASS_NAME
88

99
# Reference to the activity
10-
_PythonActivity = autoclass(JAVA_NAMESPACE + '.PythonActivity')
10+
_PythonActivity = autoclass(ACTIVITY_CLASS_NAME)
1111

1212
# Cache of functions table. In older Android versions the number of JNI references
1313
# is limited, so by caching them we avoid running out.

pythonforandroid/recipes/android/src/android/storage.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from jnius import autoclass, cast
22
import os
33

4+
from android.config import JAVA_NAMESPACE, ACTIVITY_CLASS_NAME
5+
46

57
Environment = autoclass('android.os.Environment')
68
File = autoclass('java.io.File')
@@ -28,11 +30,11 @@ def _get_activity():
2830
"""
2931
Retrieves the activity from `PythonActivity` fallback to `PythonService`.
3032
"""
31-
PythonActivity = autoclass('org.kivy.android.PythonActivity')
33+
PythonActivity = autoclass(ACTIVITY_CLASS_NAME)
3234
activity = PythonActivity.mActivity
3335
if activity is None:
3436
# assume we're running from the background service
35-
PythonService = autoclass('org.kivy.android.PythonService')
37+
PythonService = autoclass(JAVA_NAMESPACE + '.' + 'PythonService')
3638
activity = PythonService.mService
3739
return activity
3840

pythonforandroid/toolchain.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,11 @@ def __init__(self):
376376
dest='local_recipes', default='./p4a-recipes',
377377
help='Directory to look for local recipes')
378378

379+
generic_parser.add_argument(
380+
'--activity-class-name',
381+
dest='activity_class_name', default='org.kivy.android.PythonActivity',
382+
help='The full java class name of the main activity')
383+
379384
generic_parser.add_argument(
380385
'--java-build-tool',
381386
dest='java_build_tool', default='auto',
@@ -704,6 +709,8 @@ def add_parser(subparsers, *args, **kwargs):
704709
self.ctx.local_recipes = args.local_recipes
705710
self.ctx.copy_libs = args.copy_libs
706711

712+
self.ctx.activity_class_name = args.activity_class_name
713+
707714
# Each subparser corresponds to a method
708715
command = args.subparser_name.replace('-', '_')
709716
getattr(self, command)(args)

tests/test_toolchain.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def test_create(self):
6060
'--bootstrap=service_only',
6161
'--requirements=python3',
6262
'--dist-name=test_toolchain',
63+
'--activity-class-name=abc.myapp.android.CustomPythonActivity',
6364
]
6465
with patch_sys_argv(argv), mock.patch(
6566
'pythonforandroid.build.get_available_apis'
@@ -77,7 +78,8 @@ def test_create(self):
7778
m_get_toolchain_versions.return_value = (['4.9'], True)
7879
m_get_ndk_platform_dir.return_value = (
7980
'/tmp/android-ndk/platforms/android-21/arch-arm', True)
80-
ToolchainCL()
81+
tchain = ToolchainCL()
82+
assert tchain.ctx.activity_class_name == 'abc.myapp.android.CustomPythonActivity'
8183
assert m_get_available_apis.call_args_list in [
8284
[mock.call('/tmp/android-sdk')], # linux case
8385
[mock.call('/private/tmp/android-sdk')] # macos case

0 commit comments

Comments
 (0)