|
| 1 | +# ------------------------------------------------------------------- |
| 2 | +# Broadcast receiver bridge |
| 3 | + |
| 4 | +from jnius import autoclass, PythonJavaClass, java_method |
| 5 | + |
| 6 | +class BroadcastReceiver(object): |
| 7 | + |
| 8 | + class Callback(PythonJavaClass): |
| 9 | + __javainterfaces__ = ['org/renpy/android/GenericBroadcastReceiverCallback'] |
| 10 | + __javacontext__ = 'app' |
| 11 | + |
| 12 | + def __init__(self, callback, *args, **kwargs): |
| 13 | + self.callback = callback |
| 14 | + PythonJavaClass.__init__(self, *args, **kwargs) |
| 15 | + |
| 16 | + @java_method('(Landroid/content/Context;Landroid/content/Intent;)V') |
| 17 | + def onReceive(self, context, intent): |
| 18 | + self.callback(context, intent) |
| 19 | + |
| 20 | + def __init__(self, callback, actions=None, categories=None): |
| 21 | + super(BroadcastReceiver, self).__init__() |
| 22 | + self.callback = callback |
| 23 | + |
| 24 | + if not actions and not categories: |
| 25 | + raise Exception('You need to define at least actions or categories') |
| 26 | + |
| 27 | + # resolve actions/categories first |
| 28 | + Intent = autoclass('android.content.Intent') |
| 29 | + resolved_actions = [] |
| 30 | + if actions: |
| 31 | + for x in actions: |
| 32 | + name = 'ACTION_{}'.format(x.upper()) |
| 33 | + if not hasattr(Intent, name): |
| 34 | + raise Exception('The intent {} doesnt exist'.format(name)) |
| 35 | + resolved_actions += [getattr(Intent, name)] |
| 36 | + |
| 37 | + resolved_categories = [] |
| 38 | + if categories: |
| 39 | + for x in categories: |
| 40 | + name = 'CATEGORY_{}'.format(x.upper()) |
| 41 | + if not hasattr(Intent, name): |
| 42 | + raise Exception('The intent {} doesnt exist'.format(name)) |
| 43 | + resolved_categories += [getattr(Intent, name)] |
| 44 | + |
| 45 | + # resolve android API |
| 46 | + PythonActivity = autoclass('org.renpy.android.PythonActivity') |
| 47 | + GenericBroadcastReceiver = autoclass('org.renpy.android.GenericBroadcastReceiver') |
| 48 | + IntentFilter = autoclass('android.content.IntentFilter') |
| 49 | + HandlerThread = autoclass('android.os.HandlerThread') |
| 50 | + |
| 51 | + # create a thread for handling events from the receiver |
| 52 | + self.handlerthread = HandlerThread('handlerthread') |
| 53 | + |
| 54 | + # create a listener |
| 55 | + self.context = PythonActivity.mActivity |
| 56 | + self.listener = BroadcastReceiver.Callback(self.callback) |
| 57 | + self.receiver = GenericBroadcastReceiver(self.listener) |
| 58 | + self.receiver_filter = IntentFilter() |
| 59 | + for x in resolved_actions: |
| 60 | + self.receiver_filter.addAction(x) |
| 61 | + for x in resolved_categories: |
| 62 | + self.receiver_filter.addCategory(x) |
| 63 | + |
| 64 | + def start(self): |
| 65 | + Handler = autoclass('android.os.Handler') |
| 66 | + self.handlerthread.start() |
| 67 | + self.handler = Handler(self.handlerthread.getLooper()) |
| 68 | + self.context.registerReceiver(self.receiver, self.receiver_filter, None, |
| 69 | + self.handler) |
| 70 | + |
| 71 | + def stop(self): |
| 72 | + self.context.unregisterReceiver(self.receiver) |
| 73 | + self.handlerthread.quit() |
| 74 | + |
| 75 | + |
0 commit comments