diff --git a/src/bitmessagekivy/baseclass/scan_screen.py b/src/bitmessagekivy/baseclass/scan_screen.py new file mode 100644 index 00000000..86549fb8 --- /dev/null +++ b/src/bitmessagekivy/baseclass/scan_screen.py @@ -0,0 +1,104 @@ +# 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