From 529bfb17c960a012dd28780a0213a046a1ca714a Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Mon, 2 Sep 2019 16:43:43 +0200 Subject: [PATCH 01/10] Adds PyPI and readthedocs badges --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f5d2006..886e478 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # zbarcam [![Build Status](https://travis-ci.org/kivy-garden/zbarcam.svg?branch=develop)](https://travis-ci.org/kivy-garden/zbarcam) +[![PyPI version](https://badge.fury.io/py/zbarcam.svg)](https://badge.fury.io/py/zbarcam) +[![Documentation Status](https://readthedocs.org/projects/zbarcam/badge/?version=latest)](https://zbarcam.readthedocs.io/en/latest/?badge=latest) Real time Barcode and QR Code scanner using the camera. It's built on top of [Kivy](https://github.com/kivy/kivy) and [pyzbar](https://github.com/NaturalHistoryMuseum/pyzbar). From d0f72d9e52053dfcf5ce8ff168cc67d132b9fd65 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Mon, 2 Sep 2019 16:53:27 +0200 Subject: [PATCH 02/10] Fixes UI tests --- Makefile | 2 +- tests/ui/test_zbarcam_ui.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 94f2390..99f0db7 100644 --- a/Makefile +++ b/Makefile @@ -116,7 +116,7 @@ test: uitest: virtualenv $(PIP) install -r requirements/test_requirements.txt - $(PYTHON) -m unittest discover --top-level-directory=. --start-directory=tests/ui/ + PYTHONPATH=src $(PYTHON) -m unittest discover --top-level-directory=. --start-directory=tests/ui/ docs: cd $(DOCS_DIR) && SPHINXBUILD=$(SPHINXBUILD) make html diff --git a/tests/ui/test_zbarcam_ui.py b/tests/ui/test_zbarcam_ui.py index 7d45060..f33f177 100644 --- a/tests/ui/test_zbarcam_ui.py +++ b/tests/ui/test_zbarcam_ui.py @@ -4,7 +4,7 @@ from functools import partial import mock from kivy.clock import Clock -from kivy_garden.zbarcam.main import DemoApp +from main import DemoApp from kivy_garden.zbarcam.zbarcam import ZBarCam From 94125691b97094eb5824d7e8109728441c669b65 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Mon, 2 Sep 2019 17:53:33 +0200 Subject: [PATCH 03/10] Linter fixes --- Makefile | 14 ++++++++++++++ setup.py | 1 + src/main.py | 1 + tests/ui/test_zbarcam_ui.py | 4 +++- tox.ini | 4 ++-- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 99f0db7..e7d4d35 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,9 @@ PIP=$(VENV_NAME)/bin/pip TOX=`which tox` GARDEN=$(VENV_NAME)/bin/garden PYTHON=$(VENV_NAME)/bin/python +ISORT=$(VENV_NAME)/bin/isort +FLAKE8=$(VENV_NAME)/bin/flake8 +SOURCES=src/ tests/ setup.py setup_meta.py # using full path so it can be used outside the root dir SPHINXBUILD=$(shell realpath venv/bin/sphinx-build) DOCS_DIR=doc @@ -118,5 +121,16 @@ uitest: virtualenv $(PIP) install -r requirements/test_requirements.txt PYTHONPATH=src $(PYTHON) -m unittest discover --top-level-directory=. --start-directory=tests/ui/ +isort-check: + $(ISORT) --check-only --recursive --diff $(SOURCES) + +isort-fix: + $(ISORT) --recursive $(SOURCES) + +flake8: + $(FLAKE8) $(SOURCES) + +lint: isort-check, flake8 + docs: cd $(DOCS_DIR) && SPHINXBUILD=$(SPHINXBUILD) make html diff --git a/setup.py b/setup.py index bb1ef1a..2a40a3c 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ import os from setuptools import find_namespace_packages, setup + from src.kivy_garden.zbarcam import version diff --git a/src/main.py b/src/main.py index 6db2c13..ab19071 100755 --- a/src/main.py +++ b/src/main.py @@ -9,6 +9,7 @@ from kivy.app import App from kivy.lang import Builder + DEMO_APP_KV_LANG = """ #:import ZBarCam kivy_garden.zbarcam.ZBarCam #:import ZBarSymbol pyzbar.pyzbar.ZBarSymbol diff --git a/tests/ui/test_zbarcam_ui.py b/tests/ui/test_zbarcam_ui.py index f33f177..9cf1f73 100644 --- a/tests/ui/test_zbarcam_ui.py +++ b/tests/ui/test_zbarcam_ui.py @@ -2,10 +2,12 @@ import time import unittest from functools import partial + import mock from kivy.clock import Clock -from main import DemoApp + from kivy_garden.zbarcam.zbarcam import ZBarCam +from main import DemoApp class UITestCase(unittest.TestCase): diff --git a/tox.ini b/tox.ini index 810095d..4621780 100644 --- a/tox.ini +++ b/tox.ini @@ -21,10 +21,10 @@ commands = pytest --ignore tests/ui/ tests/ [testenv:pep8] deps = -r{toxinidir}/requirements/test_requirements.txt -commands = flake8 kivy_garden/ tests/ setup.py setup_meta.py +commands = flake8 src/ tests/ setup.py setup_meta.py [testenv:isort-check] deps = -r{toxinidir}/requirements/test_requirements.txt commands = - isort --check-only --recursive --diff kivy_garden/ tests/ setup.py setup_meta.py + isort --check-only --recursive --diff src/ tests/ setup.py setup_meta.py From be39b644810733c409c0f641fdea9b4c79f3936f Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Mon, 2 Sep 2019 17:57:58 +0200 Subject: [PATCH 04/10] Updates buildozer, p4a and ndk versions, fixes #21 --- CHANGELOG.md | 3 +++ buildozer.spec | 38 ++++++++++++++++++++++++++++------ dockerfiles/Dockerfile-android | 20 ++++++++++-------- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6479d74..9f12dbf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Change Log +## [Unreleased] + - Update buildozer, p4a, and ndk versions, refs #21 + ## [20190902] - Update Cython for Python3.7 support, refs #35 diff --git a/buildozer.spec b/buildozer.spec index a443aea..276eee5 100644 --- a/buildozer.spec +++ b/buildozer.spec @@ -60,7 +60,7 @@ garden_requirements = xcamera # (str) Icon of the application #icon.filename = %(source.dir)s/data/icon.png -# (str) Supported orientation (one of landscape, portrait or all) +# (str) Supported orientation (one of landscape, sensorLandscape, portrait or all) orientation = portrait # (list) List of service to declare @@ -106,7 +106,7 @@ android.minapi = 21 android.sdk = 20 # (str) Android NDK version to use -android.ndk = 17c +android.ndk = 19b # (int) Android NDK API to use. This is the minimum API your app will support, it should usually match android.minapi. android.ndk_api = 21 @@ -164,8 +164,8 @@ android.accept_sdk_license = True # bootstrap) #android.gradle_dependencies = -# (str) python-for-android branch to use, defaults to master -p4a.branch = master +# (list) Java classes to add as activities to the manifest. +#android.add_activites = com.example.ExampleActivity # (str) OUYA Console category. Should be one of GAME or APP # If you leave this blank, OUYA support will not be enabled @@ -177,9 +177,13 @@ p4a.branch = master # (str) XML file to include as an intent filters in tag #android.manifest.intent_filters = -# (list) Android additionnal libraries to copy into libs/armeabi +# (str) launchMode to set for the main activity +#android.manifest.launch_mode = standard + +# (list) Android additional libraries to copy into libs/armeabi #android.add_libs_armeabi = libs/android/*.so #android.add_libs_armeabi_v7a = libs/android-v7/*.so +#android.add_libs_arm64_v8a = libs/android-v8/*.so #android.add_libs_x86 = libs/android-x86/*.so #android.add_libs_mips = libs/android-mips/*.so @@ -194,19 +198,28 @@ p4a.branch = master # project.properties automatically.) #android.library_references = +# (list) Android shared libraries which will be added to AndroidManifest.xml using tag +#android.uses_library = + # (str) Android logcat filters to use #android.logcat_filters = *:S python:D # (bool) Copy library instead of making a libpymodules.so #android.copy_libs = 1 -# (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86 +# (str) The Android arch to build for, choices: armeabi-v7a, arm64-v8a, x86, x86_64 android.arch = armeabi-v7a # # Python for android (p4a) specific # +# (str) python-for-android fork to use, defaults to upstream (kivy) +#p4a.fork = kivy + +# (str) python-for-android branch to use, defaults to master +p4a.branch = develop + # (str) python-for-android git clone directory (if empty, it will be automatically cloned from github) #p4a.source_dir = @@ -219,6 +232,9 @@ android.arch = armeabi-v7a # (str) Bootstrap to use for android builds # p4a.bootstrap = sdl2 +# (int) port number to specify an explicit --port= p4a argument (eg for bootstrap flask) +#p4a.port = + # # iOS specific @@ -226,6 +242,16 @@ android.arch = armeabi-v7a # (str) Path to a custom kivy-ios folder #ios.kivy_ios_dir = ../kivy-ios +# Alternately, specify the URL and branch of a git checkout: +ios.kivy_ios_url = https://github.com/kivy/kivy-ios +ios.kivy_ios_branch = master + +# Another platform dependency: ios-deploy +# Uncomment to use a custom checkout +#ios.ios_deploy_dir = ../ios_deploy +# Or specify URL and branch +ios.ios_deploy_url = https://github.com/phonegap/ios-deploy +ios.ios_deploy_branch = 1.7.0 # (str) Name of the certificate to use for signing the debug version # Get a list of available identities: buildozer ios list_identities diff --git a/dockerfiles/Dockerfile-android b/dockerfiles/Dockerfile-android index 2460257..bf9c1b7 100644 --- a/dockerfiles/Dockerfile-android +++ b/dockerfiles/Dockerfile-android @@ -14,9 +14,10 @@ ENV USER="user" ENV HOME_DIR="/home/${USER}" ENV WORK_DIR="${HOME_DIR}" \ PATH="${HOME_DIR}/.local/bin:${PATH}" -ENV DOCKERFILES_VERSION="master" \ +ENV DOCKERFILES_VERSION="v20190902" \ DOCKERFILES_URL="https://raw.githubusercontent.com/AndreMiras/dockerfiles" -ENV MAKEFILES_URL="${DOCKERFILES_URL}/${DOCKERFILES_VERSION}/buildozer_android_new" +ENV MAKEFILES_URL="${DOCKERFILES_URL}/${DOCKERFILES_VERSION}/buildozer_android" +ENV BUILDOZER_VERSION="182d13f" # configure locale @@ -31,22 +32,23 @@ ENV LANG="en_US.UTF-8" \ RUN apt install -qq --yes --no-install-recommends \ autoconf \ automake \ - cmake \ - make \ ca-certificates \ + cmake \ curl \ gettext \ libffi-dev \ libltdl-dev \ + libpython2.7-dev \ libpython3.6-dev \ libtool \ - file \ + make \ openjdk-8-jdk \ pkg-config \ python3.6 \ python3-setuptools \ - python-pip \ - python-setuptools \ + python3-pip \ + python3-setuptools \ + python \ sudo \ unzip \ xz-utils \ @@ -64,8 +66,8 @@ WORKDIR ${WORK_DIR} # install buildozer and dependencies RUN curl --location --progress-bar ${MAKEFILES_URL}/buildozer.mk --output buildozer.mk RUN make -f buildozer.mk -# enforces buildozer master (cf880a3) until next release -RUN pip install --upgrade https://github.com/kivy/buildozer/archive/cf880a3.zip +# enforces buildozer master until next release +RUN pip3 install --upgrade https://github.com/kivy/buildozer/archive/${BUILDOZER_VERSION}.zip COPY . ${WORK_DIR} # limits the amount of logs for Travis From 2bdd7199c8fd466055d18f7fbe47cb5eb1ba6803 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Mon, 2 Sep 2019 22:39:24 +0200 Subject: [PATCH 05/10] Prepares for F-Droid auto updates, refs #20 --- CHANGELOG.md | 1 + src/kivy_garden/zbarcam/version.py | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f12dbf..6f64c6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [Unreleased] - Update buildozer, p4a, and ndk versions, refs #21 + - Publish to F-Droid, refs #20 ## [20190902] diff --git a/src/kivy_garden/zbarcam/version.py b/src/kivy_garden/zbarcam/version.py index b29cb33..b82db7f 100644 --- a/src/kivy_garden/zbarcam/version.py +++ b/src/kivy_garden/zbarcam/version.py @@ -1 +1,7 @@ __version__ = '2019.0902' +# The `__version_code__` is used for the F-Droid auto update and should match +# the `versionCode` from the `build.gradle` file located in: +# `.buildozer/android/platform/build/dists/zbarcam/` +# The auto update method used is the `HTTP`, see: +# https://f-droid.org/en/docs/Build_Metadata_Reference/#UpdateCheckMode +__version_code__ = 721202802 From 543ea49bc68bbf145cc5e6a5865a521c76c7b646 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Wed, 4 Sep 2019 15:27:34 +0200 Subject: [PATCH 06/10] Only access the camera if available, fixes #12 On Android, trying to access the camera without permission was causing crashes. This is mitigated by postponing the `camera.open()` call until the `CAMERA` permission is given. Also fixes #16. --- CHANGELOG.md | 1 + Makefile | 2 +- src/kivy_garden/zbarcam/utils.py | 44 ++++++++++++++ src/kivy_garden/zbarcam/zbarcam.kv | 8 +-- src/kivy_garden/zbarcam/zbarcam.py | 93 ++++++++++++++++++------------ tests/ui/test_zbarcam_ui.py | 2 +- 6 files changed, 107 insertions(+), 43 deletions(-) create mode 100644 src/kivy_garden/zbarcam/utils.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f64c6e..37479a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [Unreleased] - Update buildozer, p4a, and ndk versions, refs #21 - Publish to F-Droid, refs #20 + - Improve Android camera permission handling, refs #12, #16 ## [20190902] diff --git a/Makefile b/Makefile index e7d4d35..dfbf4f9 100644 --- a/Makefile +++ b/Makefile @@ -130,7 +130,7 @@ isort-fix: flake8: $(FLAKE8) $(SOURCES) -lint: isort-check, flake8 +lint: isort-check flake8 docs: cd $(DOCS_DIR) && SPHINXBUILD=$(SPHINXBUILD) make html diff --git a/src/kivy_garden/zbarcam/utils.py b/src/kivy_garden/zbarcam/utils.py new file mode 100644 index 0000000..3164f18 --- /dev/null +++ b/src/kivy_garden/zbarcam/utils.py @@ -0,0 +1,44 @@ +from kivy.utils import platform +from PIL import ImageOps + + +def is_android(): + return platform == 'android' + + +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. + """ + if not is_android(): + return pil_image + pil_image = pil_image.rotate(90) + pil_image = ImageOps.mirror(pil_image) + return pil_image diff --git a/src/kivy_garden/zbarcam/zbarcam.kv b/src/kivy_garden/zbarcam/zbarcam.kv index 7c4722f..80a5d6e 100644 --- a/src/kivy_garden/zbarcam/zbarcam.kv +++ b/src/kivy_garden/zbarcam/zbarcam.kv @@ -1,10 +1,10 @@ -#:import XCamera kivy.garden.xcamera.XCamera +#:import is_android kivy_garden.zbarcam.utils.is_android : Widget: # invert width/height on rotated Android # https://stackoverflow.com/a/45192295/185510 id: proxy - XCamera: + CustomXCamera: id: xcamera play: True resolution: root.resolution @@ -12,14 +12,14 @@ keep_ratio: True center: self.size and proxy.center size: - (proxy.height, proxy.width) if root.is_android() \ + (proxy.height, proxy.width) if is_android() \ else (proxy.width, proxy.height) # Android camera rotation workaround, refs: # https://github.com/AndreMiras/garden.zbarcam/issues/3 canvas.before: PushMatrix Rotate: - angle: -90 if root.is_android() else 0 + angle: -90 if is_android() else 0 origin: self.center canvas.after: PopMatrix diff --git a/src/kivy_garden/zbarcam/zbarcam.py b/src/kivy_garden/zbarcam/zbarcam.py index c0d175b..e27bee4 100644 --- a/src/kivy_garden/zbarcam/zbarcam.py +++ b/src/kivy_garden/zbarcam/zbarcam.py @@ -2,17 +2,58 @@ from collections import namedtuple import PIL -from kivy.clock import Clock +from kivy.clock import Clock, mainthread +from kivy.garden.xcamera import XCamera from kivy.lang import Builder from kivy.properties import ListProperty from kivy.uix.anchorlayout import AnchorLayout -from kivy.utils import platform -from PIL import ImageOps from pyzbar import pyzbar +from .utils import (check_request_camera_permission, fix_android_image, + is_android) + 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. @@ -26,11 +67,10 @@ class ZBarCam(AnchorLayout): code_types = ListProperty(set(pyzbar.ZBarSymbol)) def __init__(self, **kwargs): - self._request_android_permissions() # lazy loading the kv file rather than loading at module level, # that way the `XCamera` import doesn't happen too early Builder.load_file(os.path.join(MODULE_DIRECTORY, "zbarcam.kv")) - super(ZBarCam, self).__init__(**kwargs) + super().__init__(**kwargs) Clock.schedule_once(lambda dt: self._setup()) def _setup(self): @@ -38,9 +78,16 @@ def _setup(self): Postpones some setup tasks that require self.ids dictionary. """ self._remove_shoot_button() + # `self.xcamera._camera` instance may not be available if e.g. + # the `CAMERA` permission is not granted + self.xcamera.bind(on_camera_ready=self._on_camera_ready) + + def _on_camera_ready(self, xcamera): + """ + Starts binding when the `xcamera._camera` instance is ready. + """ + xcamera._camera.bind(on_texture=self._on_texture) self._enable_android_autofocus() - self.xcamera._camera.bind(on_texture=self._on_texture) - # self.add_widget(self.xcamera) def _remove_shoot_button(self): """ @@ -55,33 +102,13 @@ def _enable_android_autofocus(self): """ Enables autofocus on Android. """ - if not self.is_android(): + if not is_android(): return camera = self.xcamera._camera._android_camera params = camera.getParameters() params.setFocusMode('continuous-video') camera.setParameters(params) - def _request_android_permissions(self): - """ - Requests CAMERA permission on Android. - """ - if not self.is_android(): - return - from android.permissions import request_permission, Permission - request_permission(Permission.CAMERA) - - @classmethod - def _fix_android_image(cls, pil_image): - """ - On Android, the image seems mirrored and rotated somehow, refs #32. - """ - if not cls.is_android(): - return pil_image - pil_image = pil_image.rotate(90) - pil_image = ImageOps.mirror(pil_image) - return pil_image - def _on_texture(self, instance): self.symbols = self._detect_qrcode_frame( texture=instance.texture, code_types=self.code_types) @@ -96,7 +123,7 @@ def _detect_qrcode_frame(cls, texture, code_types): # https://github.com/AndreMiras/garden.zbarcam/issues/41 pil_image = PIL.Image.frombytes(mode='RGBA', size=size, data=image_data) - pil_image = cls._fix_android_image(pil_image) + pil_image = fix_android_image(pil_image) symbols = [] codes = pyzbar.decode(pil_image, symbols=code_types) for code in codes: @@ -113,11 +140,3 @@ def start(self): def stop(self): self.xcamera.play = False - - @staticmethod - def is_android(): - return platform == 'android' - - @staticmethod - def is_ios(): - return platform == 'ios' diff --git a/tests/ui/test_zbarcam_ui.py b/tests/ui/test_zbarcam_ui.py index 9cf1f73..024a43e 100644 --- a/tests/ui/test_zbarcam_ui.py +++ b/tests/ui/test_zbarcam_ui.py @@ -58,7 +58,7 @@ def run_test(self, app, *args): def test_ui_base(self): # uses the `wraps` parameter to conditionally enable/disable mock Camera = self.get_camera_class() - with mock.patch('kivy.core.camera.Camera', wraps=Camera): + with mock.patch('kivy.uix.camera.CoreCamera', wraps=Camera): app = DemoApp() p = partial(self.run_test, app) Clock.schedule_once(p, 0.000001) From f2d0c05e22b8f4140c85780ae1fd4535b93e5319 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Wed, 4 Sep 2019 22:04:24 +0200 Subject: [PATCH 07/10] Relies on Kivy upstream autofocus, fixes #8 refs https://github.com/kivy/kivy/pull/5940 --- CHANGELOG.md | 1 + src/kivy_garden/zbarcam/zbarcam.py | 15 +-------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37479a6..9f15ae0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Update buildozer, p4a, and ndk versions, refs #21 - Publish to F-Droid, refs #20 - Improve Android camera permission handling, refs #12, #16 + - Use upstream autofocus, refs #8 ## [20190902] diff --git a/src/kivy_garden/zbarcam/zbarcam.py b/src/kivy_garden/zbarcam/zbarcam.py index e27bee4..5ed2588 100644 --- a/src/kivy_garden/zbarcam/zbarcam.py +++ b/src/kivy_garden/zbarcam/zbarcam.py @@ -9,8 +9,7 @@ from kivy.uix.anchorlayout import AnchorLayout from pyzbar import pyzbar -from .utils import (check_request_camera_permission, fix_android_image, - is_android) +from .utils import check_request_camera_permission, fix_android_image MODULE_DIRECTORY = os.path.dirname(os.path.realpath(__file__)) @@ -87,7 +86,6 @@ def _on_camera_ready(self, xcamera): Starts binding when the `xcamera._camera` instance is ready. """ xcamera._camera.bind(on_texture=self._on_texture) - self._enable_android_autofocus() def _remove_shoot_button(self): """ @@ -98,17 +96,6 @@ def _remove_shoot_button(self): shoot_button = xcamera.children[0] xcamera.remove_widget(shoot_button) - def _enable_android_autofocus(self): - """ - Enables autofocus on Android. - """ - if not is_android(): - return - camera = self.xcamera._camera._android_camera - params = camera.getParameters() - params.setFocusMode('continuous-video') - camera.setParameters(params) - def _on_texture(self, instance): self.symbols = self._detect_qrcode_frame( texture=instance.texture, code_types=self.code_types) From b21eee282b9dc84a72e409cd4f486d569210f8ee Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Fri, 6 Sep 2019 10:37:04 +0200 Subject: [PATCH 08/10] Fixes broken demo link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 886e478..5230d0f 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ BoxLayout: size: self.texture_size[0], 50 text: ', '.join([str(symbol.data) for symbol in zbarcam.symbols]) ``` -A full working demo is available in [kivy_garden/zbarcam/main.py](kivy_garden/zbarcam/main.py). +A full working demo is available in [src/main.py](https://github.com/kivy-garden/zbarcam/blob/master/src/main.py). ## Install From a8e0d41cbb6e91b26234772c734fd02252d3eef1 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 7 Sep 2019 02:27:33 +0200 Subject: [PATCH 09/10] Improves release process via Makefile and doc Adds `Makefile` `release/*` target. --- CHANGELOG.md | 3 ++- Makefile | 10 ++++++++++ doc/source/release.md | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f15ae0..a49fbc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,13 @@ # Change Log ## [Unreleased] + - Update buildozer, p4a, and ndk versions, refs #21 - Publish to F-Droid, refs #20 - Improve Android camera permission handling, refs #12, #16 - Use upstream autofocus, refs #8 -## [20190902] +## [2019.0902] - Update Cython for Python3.7 support, refs #35 - Make garden.zbarcam a package again, refs #36 diff --git a/Makefile b/Makefile index dfbf4f9..9ce45e5 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ GARDEN=$(VENV_NAME)/bin/garden PYTHON=$(VENV_NAME)/bin/python ISORT=$(VENV_NAME)/bin/isort FLAKE8=$(VENV_NAME)/bin/flake8 +TWINE=`which twine` SOURCES=src/ tests/ setup.py setup_meta.py # using full path so it can be used outside the root dir SPHINXBUILD=$(shell realpath venv/bin/sphinx-build) @@ -134,3 +135,12 @@ lint: isort-check flake8 docs: cd $(DOCS_DIR) && SPHINXBUILD=$(SPHINXBUILD) make html + +release/build: + rm -rf dist/ build/ + $(PYTHON) setup.py sdist bdist_wheel + $(PYTHON) setup_meta.py sdist bdist_wheel + $(TWINE) check dist/* + +release/upload: + $(TWINE) upload dist/* diff --git a/doc/source/release.md b/doc/source/release.md index ff51794..160196b 100644 --- a/doc/source/release.md +++ b/doc/source/release.md @@ -8,7 +8,7 @@ This is documenting the release process. Make sure the CHANGELOG.md is up to date and follows the http://keepachangelog.com guidelines. Start the release with git flow: ```sh -git flow release start YYYYMMDD +git flow release start YYYY.MMDD ``` Now update the [CHANGELOG.md](/CHANGELOG.md) `[Unreleased]` section to match the new release version. Also update the `version` string from the @@ -16,7 +16,7 @@ Also update the `version` string from the file. Then commit and finish release. ```sh -git commit -a -m "YYYYMMDD" +git commit -a -m "YYYY.MMDD" git flow release finish ``` Push everything, make sure tags are also pushed: From ed1e3fa9621466dcf1ce99a89c70552e866325ff Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 7 Sep 2019 02:35:11 +0200 Subject: [PATCH 10/10] 2019.0907 --- CHANGELOG.md | 2 +- src/kivy_garden/zbarcam/version.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a49fbc3..66f8559 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## [Unreleased] +## [2019.0907] - Update buildozer, p4a, and ndk versions, refs #21 - Publish to F-Droid, refs #20 diff --git a/src/kivy_garden/zbarcam/version.py b/src/kivy_garden/zbarcam/version.py index b82db7f..621582f 100644 --- a/src/kivy_garden/zbarcam/version.py +++ b/src/kivy_garden/zbarcam/version.py @@ -1,7 +1,7 @@ -__version__ = '2019.0902' +__version__ = '2019.0907' # The `__version_code__` is used for the F-Droid auto update and should match # the `versionCode` from the `build.gradle` file located in: -# `.buildozer/android/platform/build/dists/zbarcam/` +# `.buildozer/android/platform/build/dists/zbarcamdemo/` # The auto update method used is the `HTTP`, see: # https://f-droid.org/en/docs/Build_Metadata_Reference/#UpdateCheckMode -__version_code__ = 721202802 +__version_code__ = 721202807