Skip to content

Commit 85b88d8

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

File tree

11 files changed

+49
-17
lines changed

11 files changed

+49
-17
lines changed

pythonforandroid/build.py

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

450+
self.activity_package = u'org.kivy.android'
451+
self.activity_class_name = u'PythonActivity'
452+
450453
# this list should contain all Archs, it is pruned later
451454
self.archs = (
452455
ArchARM(self),

pythonforandroid/recipes/android/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ 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_PACKAGE': self.ctx.activity_package,
56+
'ACTIVITY_NAMESPACE': self.ctx.activity_package.replace('.', '/'),
5457
}
5558

5659
# 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_PACKAGE + u'.' + 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_PACKAGE + '.' + ACTIVITY_CLASS_NAME).mActivity
297297
if as_foreground:
298298
mActivity.start_service(
299299
title, description, arg

pythonforandroid/recipes/android/src/android/_ctypes_library_finder.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11

22
import os
33

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

57
def get_activity_lib_dir(activity_name):
68
from jnius import autoclass
@@ -51,6 +53,10 @@ def find_library(name):
5153
lib_dir_2 = get_activity_lib_dir("org.kivy.android.PythonService")
5254
if lib_dir_2 is not None and lib_dir_2 not in lib_search_dirs:
5355
lib_search_dirs.insert(0, lib_dir_2)
56+
if ACTIVITY_PACKAGE+'.'+ACTIVITY_CLASS_NAME != 'org.kivy.android.PythonActivity':
57+
lib_dir_3 = get_activity_lib_dir(ACTIVITY_PACKAGE+'.'+ACTIVITY_CLASS_NAME)
58+
if lib_dir_3 is not None:
59+
lib_search_dirs.insert(0, lib_dir_3)
5460

5561
# Now scan the lib dirs:
5662
for lib_dir in [ldir for ldir in lib_search_dirs if os.path.exists(ldir)]:

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 JAVA_NAMESPACE, JNI_NAMESPACE, ACTIVITY_CLASS_NAME, ACTIVITY_PACKAGE, ACTIVITY_NAMESPACE
33

4-
_activity = autoclass(JAVA_NAMESPACE + '.PythonActivity').mActivity
4+
_activity = autoclass(ACTIVITY_PACKAGE + '.' + 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_NAMESPACE + '/' + ACTIVITY_CLASS_NAME + '$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_NAMESPACE + '/' + ACTIVITY_CLASS_NAME + '$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, ACTIVITY_PACKAGE
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_PACKAGE + '.' + 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, ACTIVITY_PACKAGE
5+
46

57
def hide_loading_screen():
6-
python_activity = autoclass('org.kivy.android.PythonActivity')
8+
python_activity = autoclass(ACTIVITY_PACKAGE + '.' + 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 JAVA_NAMESPACE, ACTIVITY_CLASS_NAME, ACTIVITY_PACKAGE, ACTIVITY_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_NAMESPACE + '/' + ACTIVITY_CLASS_NAME + '$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_PACKAGE + '.' + 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_PACKAGE + '.' + 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_PACKAGE + '.' + 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 JAVA_NAMESPACE, ACTIVITY_CLASS_NAME, ACTIVITY_PACKAGE
88

99
# Reference to the activity
10-
_PythonActivity = autoclass(JAVA_NAMESPACE + '.PythonActivity')
10+
_PythonActivity = autoclass(ACTIVITY_PACKAGE + '.' + 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, ACTIVITY_PACKAGE
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_PACKAGE + '.' + 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: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,16 @@ 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-package', '--activity_package',
381+
dest='activity_package', default='org.kivy.android',
382+
help='The java package where activity class is defined')
383+
384+
generic_parser.add_argument(
385+
'--activity-class-name', '--activity_class_name',
386+
dest='activity_class_name', default='PythonActivity',
387+
help='The java class name of the main activity')
388+
379389
generic_parser.add_argument(
380390
'--java-build-tool',
381391
dest='java_build_tool', default='auto',
@@ -704,6 +714,9 @@ def add_parser(subparsers, *args, **kwargs):
704714
self.ctx.local_recipes = args.local_recipes
705715
self.ctx.copy_libs = args.copy_libs
706716

717+
self.ctx.activity_package = args.activity_package
718+
self.ctx.activity_class_name = args.activity_class_name
719+
707720
# Each subparser corresponds to a method
708721
command = args.subparser_name.replace('-', '_')
709722
getattr(self, command)(args)

0 commit comments

Comments
 (0)