Skip to content

Commit

Permalink
Migrates to xcamera==2019.928
Browse files Browse the repository at this point in the history
Last version of `xcamera` has built-in permission check support.
  • Loading branch information
AndreMiras committed Sep 29, 2019
1 parent e5be9c5 commit 437fe4f
Show file tree
Hide file tree
Showing 7 changed files with 8 additions and 72 deletions.
4 changes: 1 addition & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,9 @@ virtualenv: $(VIRTUAL_ENV)
virtualenv/test: virtualenv
$(PIP) install -r requirements/requirements-test.txt

run/linux: virtualenv
run: virtualenv
$(PYTHON) src/main.py

run: run/linux

test:
$(TOX)

Expand Down
2 changes: 1 addition & 1 deletion buildozer.spec
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ requirements =
Pillow==5.2.0,
python3,
pyzbar==0.1.8,
xcamera
xcamera==2019.928
# (str) Custom source folders for requirements
Expand Down
2 changes: 1 addition & 1 deletion requirements/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ numpy==1.16.1
opencv-python==4.1.1.26
Pillow==5.2.0
pyzbar==0.1.8
xcamera
xcamera==2019.928
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def read(fname):
'opencv-python>=4',
'pillow',
'pyzbar',
'xcamera',
'xcamera>=2019.928',
],
}

Expand Down
23 changes: 0 additions & 23 deletions src/kivy_garden/zbarcam/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,29 +10,6 @@ def is_ios():
return platform == 'ios'


def check_camera_permission():
"""
Android runtime `CAMERA` permission check.
"""
if not is_android():
return True
from android.permissions import Permission, check_permission
permission = Permission.CAMERA
return check_permission(permission)


def check_request_camera_permission(callback=None):
"""
Android runtime `CAMERA` permission check & request.
"""
had_permission = check_camera_permission()
if not had_permission:
from android.permissions import Permission, request_permissions
permissions = [Permission.CAMERA]
request_permissions(permissions, callback)
return had_permission


def fix_android_image(pil_image):
"""
On Android, the image seems mirrored and rotated somehow, refs #32.
Expand Down
3 changes: 2 additions & 1 deletion src/kivy_garden/zbarcam/zbarcam.kv
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
#:import XCamera kivy_garden.xcamera.XCamera
#:import is_android kivy_garden.zbarcam.utils.is_android
<ZBarCam>:
Widget:
# invert width/height on rotated Android
# https://stackoverflow.com/a/45192295/185510
id: proxy
CustomXCamera:
XCamera:
id: xcamera
play: True
resolution: root.resolution
Expand Down
44 changes: 2 additions & 42 deletions src/kivy_garden/zbarcam/zbarcam.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,57 +2,17 @@
from collections import namedtuple

import PIL
from kivy.clock import Clock, mainthread
from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.anchorlayout import AnchorLayout
from kivy_garden.xcamera import XCamera
from pyzbar import pyzbar

from .utils import check_request_camera_permission, fix_android_image
from .utils import fix_android_image

MODULE_DIRECTORY = os.path.dirname(os.path.realpath(__file__))


class CustomXCamera(XCamera):
"""
Inherits from `kivy_garden.xcamera.XCamera`.
Overrides `_on_index()` to make sure the `kivy.core.camera.Camera` object
is only created if permission are granted on Android.
On other system, it's a noop calling the parent `_on_index()`.
"""

def __init__(self, **kwargs):
self.register_event_type('on_camera_ready')
super().__init__(**kwargs)

def _on_index(self, *largs):
"""
Overrides `kivy.uix.camera.Camera._on_index()` to make sure
`camera.open()` is not called unless Android `CAMERA` permission is
granted, refs #12.
"""
@mainthread
def on_permissions_callback(permissions, grant_results):
"""
On camera permission callback calls parent `_on_index()` method.
"""
if all(grant_results):
self._on_index_dispatch(*largs)
if check_request_camera_permission(callback=on_permissions_callback):
self._on_index_dispatch(*largs)

def _on_index_dispatch(self, *largs):
super()._on_index(*largs)
self.dispatch('on_camera_ready')

def on_camera_ready(self):
"""
Fired when the camera is ready.
"""
pass


class ZBarCam(AnchorLayout):
"""
Widget that use the Camera and zbar to detect qrcode.
Expand Down

0 comments on commit 437fe4f

Please sign in to comment.