# pylint: disable=no-member, too-many-arguments, too-few-public-methods # pylint: disable=no-name-in-module, unused-argument, arguments-differ """ QR code Scan Screen used in message composer to get recipient address """ import os import cv2 from kivy.clock import Clock from kivy.lang import Builder from kivy.properties import ( BooleanProperty, ObjectProperty, StringProperty ) from kivy.uix.screenmanager import Screen from bitmessagekivy.get_platform import platform from debug import logger class ScanScreen(Screen): """ScanScreen is for scaning Qr code""" # pylint: disable=W0212 camera_avaialbe = BooleanProperty(False) previous_open_screen = StringProperty() pop_up_instance = ObjectProperty() def __init__(self, *args, **kwargs): """Getting AddressBook Details""" super(ScanScreen, self).__init__(*args, **kwargs) self.check_camera() def check_camera(self): """This method is used for checking camera avaibility""" if platform != "android": cap = cv2.VideoCapture(0) is_cam_open = cap.isOpened() while is_cam_open: logger.debug('Camera is available!') self.camera_avaialbe = True break else: logger.debug("Camera is not available!") self.camera_avaialbe = False else: self.camera_avaialbe = True def get_screen(self, screen_name, instance=None): """This method is used for getting previous screen name""" self.previous_open_screen = screen_name if screen_name != 'composer': self.pop_up_instance = instance def on_pre_enter(self): """ on_pre_enter works little better on android It affects screen transition on linux """ if not self.children: tmp = Builder.load_file( os.path.join( os.path.dirname(os.path.dirname(__file__)), "kv", "{}.kv").format("scanner") ) self.add_widget(tmp) if platform == "android": Clock.schedule_once(self.start_camera, 0) def on_enter(self): """ on_enter works better on linux It creates a black screen on android until camera gets loaded """ if platform != "android": Clock.schedule_once(self.start_camera, 0) def on_leave(self): """This method will call on leave""" Clock.schedule_once(self.stop_camera, 0) def start_camera(self, *args): """Its used for starting camera for scanning qrcode""" # pylint: disable=attribute-defined-outside-init self.xcam = self.children[0].ids.zbarcam.ids.xcamera if platform == "android": self.xcam.play = True else: Clock.schedule_once(self.open_cam, 0) def stop_camera(self, *args): """Its used for stop the camera""" self.xcam.play = False if platform != "android": self.xcam._camera._device.release() def open_cam(self, *args): """It will open up the camera""" if not self.xcam._camera._device.isOpened(): self.xcam._camera._device.open(self.xcam._camera._index) self.xcam.play = True