Ë
    ¾�ji‚  ã            	       óÔ  — d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZmZmZmZmZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lm Z m!Z!m"Z" d dl#m$Z$m%Z% d dl&m'Z'm(Z(m)Z) d dl*m+Z+ d dl,m-Z- d dl.­ d dl/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9  e: ejv                  dd«      «      Z< ejz                  e>«      Z?ej€                  fd„ZA G d„ de+«      ZB G d„ de'«      ZC G d„ d«      ZD G d„ d«      ZE G d„ d eBeCeEeeD«      ZF G d!„ d"eF«      ZGd)e-d#œd$eeHej’                  f   d%e:d&eFfd'„ZJd)e-d#œd$eeHej’                  df   d%e:d&eFfd(„ZKy)*é    )Úabsolute_importÚprint_functionN)Úcached_property)ÚAnyÚDictÚListÚOptionalÚTupleÚUnion)Úetree)ÚImage)Úretry)Úxpath)ÚInputMethodMixIn)ÚHTTP_TIMEOUTÚSCROLL_STEPSÚ	Direction)ÚSelectorÚUiObject)ÚAbstractShellÚAbstractUiautomatorServerÚShellResponse)Ú_BaseClient)ÚDEFAULT_SERVER_PORT)Ú*)ÚSettings©ÚSwipeExt)Ú
deprecatedÚimage_convertÚlist2cmdline)ÚWatchContextÚWatcherÚWAIT_FOR_DEVICE_TIMEOUTé   c                 óì   — t         j                  sOt        j                  «       }t        j                  d«      }|j                  |«       t         j                  |«       t         j                  | «       y )NzP[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d pid:%(process)d] %(message)s)ÚloggerÚhandlersÚloggingÚStreamHandlerÚ	FormatterÚsetFormatterÚ
addHandlerÚsetLevel)ÚlevelÚhandlerÚ	formatters      úV/var/www/api.ozpay.ru/ozpay/venv/lib/python3.12/site-packages/uiautomator2/__init__.pyÚenable_pretty_loggingr3   (   sP   € Ü�?Š?ä×'Ñ'Ó)ˆÜ×%Ñ%Ð&xÓyˆ	Ø×Ñ˜YÔ'Ü×Ñ˜'Ô"ä
‡O�O�EÕó    c                   óä  — e Zd ZdZd?dedefd„Zd„ Zd@dee   dee	   fd	„Z
dAd
ee	   dee   defd„Z eedd¬«      dBdee   defd„«       ZdCdee   defd„Zed„ «       Zej(                  dCdefd„«       Zed„ «       Zdeee	f   deee	f   fd„ZdDd„ZdEdefd„ZdFdee   dee	   fd„ZdEd eee	e	f      defd!„ZdEd"„ZdCd#ee	ef   fd$„Z d#ee	ef   fd%„Z!d&„ Z"d'„ Z#edefd(„«       Z$e$jJ                  d)efd*„«       Z$dGd+efd,„Z&ed-„ «       Z'd.„ Z(edee   fd/„«       Z)d0„ Z*d1„ Z+d2„ Z,d3efd4„Z-d5„ Z.edee   fd6„«       Z/e/jJ                  d7efd8„«       Z/dCd9„Z0d:„ Z1d7efd;„Z2d<„ Z3e4defd=„«       Z5dHd>„Z6y)IÚ_Device))r   ÚnaturalÚnr   )é   ÚleftÚléZ   )é   Ú
upsidedownÚué´   )é   ÚrightÚri  Úpointer_locationÚshow_touchesc                 óx   — | j                  dt        |«      › �«       | j                  dt        |«      › �«       y)zÐ
        Show touch trace on device screen

        Args:
            pointer_location (bool): screen overlay showing current touch data
            show_touches (bool): show visual feedback for taps
        z%settings put system pointer_location z!settings put system show_touches N)ÚshellÚint)ÚselfrD   rE   s      r2   Úshow_touch_tracez_Device.show_touch_trace7   s9   € ð 	�
‰
Ð:¼3Ð?OÓ;PÐ:QÐRÔSØ�
‰
Ð6´s¸<Ó7HÐ6IÐJÕKr4   c                 óD   — | j                   j                  «       \  }}||fS )z return (width, height) )Ú_devÚwindow_size)rI   ÚwÚhs      r2   rM   z_Device.window_sizeB   s!   € à�y‰y×$Ñ$Ó&‰ˆˆ1Ø�!ˆtˆr4   NÚfilenameÚ
display_idc                 óp  — |€y| j                   j                  dd«      }|r>t        j                  |«      }t	        j
                  t        j                  |«      «      }n9| j                  j                  d¬«      }n| j                  j                  |¬«      }|r|j                  |«       yt        ||«      S )a$  
        Take screenshot of device

        Returns:
            PIL.Image.Image, np.ndarray (OpenCV format) or None

        Args:
            filename (str): saved filename, if filename is set then return None
            format (str): used when filename is empty. one of ["pillow", "opencv"]
            display_id (int): use specific display if device has multiple screen

        Examples:
            screenshot("saved.jpg")
            screenshot().save("saved.png")
            cv2.imwrite('saved.jpg', screenshot(format='opencv'))
        Nr9   éP   r   )rQ   )ÚjsonrpcÚtakeScreenshotÚbase64Ú	b64decoder   ÚopenÚioÚBytesIOrL   Ú
screenshotÚsaver    )rI   rP   ÚformatrQ   Úbase64_dataÚjpg_rawÚpil_imgs          r2   r[   z_Device.screenshotG   s—   € ð" ÐØŸ,™,×5Ñ5°a¸Ó<ˆKáÜ ×*Ñ*¨;Ó7�ÜŸ*™*¤R§Z¡Z°Ó%8Ó9‘àŸ)™)×.Ñ.¸!Ð.Ó<‘à—i‘i×*Ñ*°jÐ*ÓAˆGáØ�L‰L˜Ô"ØÜ˜W fÓ-Ð-r4   Ú	max_depthÚroot_in_activeÚreturnc                 ó<  — 	 |€| j                   d   }| j                  |||«      }|rNt        j                  |j                  d«      «      }t        j                  |ddd¬«      }|j                  d«      }|S # t        $ r t        j	                  d«       d}Y Œtw xY w)aB  
        Dump window hierarchy

        Args:
            compressed (bool): return compressed xml
            pretty (bool): pretty print xml
            max_depth (int): max depth of hierarchy
            root_in_active (bool): dump only the active window root when set

        Returns:
            xml content
        ra   zdump empty, return empty xmlzT<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy rotation="0" />zutf-8TzUTF-8)Úpretty_printÚencodingÚxml_declaration)
ÚsettingsÚ_do_dump_hierarchyÚHierarchyEmptyErrorr'   Úwarningr   Ú
fromstringÚencodeÚtostringÚdecode)rI   Ú
compressedÚprettyra   rb   ÚcontentÚroots          r2   Údump_hierarchyz_Device.dump_hierarchyh   s›   € ð	uØÐ Ø ŸM™M¨+Ñ6�	Ø×-Ñ-¨j¸)À^ÓTˆGñ
 Ü×#Ñ# G§N¡N°7Ó$;Ó<ˆDÜ—n‘n T¸ÀwÐ`dÔeˆGØ—n‘n WÓ-ˆGØˆøô #ò 	uÜ�N‰NÐ9Ô:ØtŠGð	uús   ‚$A8 Á8 BÂBrA   r9   )ÚtriesÚdelayc                 óî   — |€d}|€| j                   j                  ||«      }n| j                   j                  |||«      }|dk(  rt        d«      ‚d|v r t        j	                  d«       t        d«      ‚|S )Né2   Ú zdump hierarchy is emptyz<hierarchy rotation="0" />z/dump empty, call clear_traversed_text and retryz(dump hierarchy is empty with no children)rT   ÚdumpWindowHierarchyrj   r'   Údebug)rI   rp   ra   rb   rr   s        r2   ri   z_Device._do_dump_hierarchyƒ   s|   € àÐØˆIØÐ!Ø—l‘l×6Ñ6°zÀ9ÓM‰Gà—l‘l×6Ñ6°zÀ9ÈnÓ]ˆGØ�bŠ=Ü%Ð&?Ó@Ð@ð (¨7Ñ2Ü�L‰LÐJÔKä%Ð&PÓQÐQØˆr4   Úsecondsc                 óB   — |r|| j                   d<   | j                   d   S )zñset default wait timeout
        Args:
            seconds(float): to wait element show up

        Returns:
            Current implicitly wait seconds

        Deprecated:
            recommend use: d.settings['wait_timeout'] = 10
        Úwait_timeout©rh   ©rI   r|   s     r2   Úimplicitly_waitz_Device.implicitly_wait•   s$   € ñ Ø,3ˆD�M‰M˜.Ñ)Ø�}‰}˜^Ñ,Ð,r4   c                 ó   ‡ ‡— g Šˆ ˆfd„}|S )zQ
        returns a function which can convert percent size to pixel size
        c                 óÖ   •— | dk\  sJ ‚|dk\  sJ ‚| dk  s|dk  r!‰s‰j                  ‰j                  «       «       | dk  rt        ‰d   | z  «      } |dk  rt        ‰d   |z  «      }| |fS )Nr   r9   )ÚextendrM   rH   )ÚxÚyrI   Úsizes     €€r2   Ú_convertz%_Device.pos_rel2abs.<locals>._convert«   s}   ø€ Ø˜’6ˆM�6Ø˜’6ˆM�6à�A’˜˜Qš©Ø—‘Ø×$Ñ$Ó&ô(ð �1ŠuÜ˜˜Q™ !™Ó$�Ø�1ŠuÜ˜˜Q™ !™Ó$�Ø�a�4ˆKr4   © )rI   rˆ   r‡   s   ` @r2   Úpos_rel2absz_Device.pos_rel2abs¤   s   ù€ ð
 ˆõ	ð ˆr4   Úoperation_namec              #   ó2  K  — | j                   d   \  }}|| j                   d   vrd\  }}|r1t        j                  d|› d|› d�«       t        j                  |«       d –— |r2t        j                  d|› d|› d�«       t        j                  |«       y y ­w)NÚoperation_delayÚoperation_delay_methods)r   r   zoperation [z] pre-delay Úsz] post-delay )rh   r'   r{   ÚtimeÚsleep)rI   r‹   ÚbeforeÚafters       r2   Ú_operation_delayz_Device._operation_delay»   s’   è ø€ àŸ™Ð&7Ñ8‰ˆ�à §¡Ð/HÑ!IÑIØ ‰MˆF�EáÜ�L‰L˜; ~Ð&6°lÀ6À(È!ÐLÔMÜ�J‰J�vÔÛÙÜ�L‰L˜; ~Ð&6°mÀEÀ7È!ÐLÔMÜ�J‰J�uÕð ùs   ‚BBc                 óP   ‡‡‡‡— dŠdŠdŠ| Š G ˆˆˆˆfd„dt         «      } |«       S )zx
        ACTION_DOWN: 0 ACTION_MOVE: 2
        touch.down(x, y)
        touch.move(x, y)
        touch.up(x, y)
        r   r=   r9   c                   ó>   •— e Zd Zˆ ˆfd„Zˆˆfd„Zˆˆfd„Zdefd„Zy)ú_Device.touch.<locals>._Touchc                 ón   •— ‰j                  ||«      \  }}‰j                  j                  ‰||d«       | S ©Nr   ©rŠ   rT   ÚinjectInputEvent)rI   r…   r†   ÚACTION_DOWNÚobjs      €€r2   Údownz"_Device.touch.<locals>._Touch.downÙ   ó4   ø€ Ø—‘ q¨!Ó,‘��1Ø—‘×,Ñ,¨[¸!¸QÀÔBØ�r4   c                 ón   •— ‰j                  ||«      \  }}‰j                  j                  ‰||d«       | S r™   rš   )rI   r…   r†   ÚACTION_MOVEr�   s      €€r2   Úmovez"_Device.touch.<locals>._Touch.moveÞ   rŸ   r4   c                 ón   •— ‰j                  ||«      \  }}‰j                  j                  ‰||d«       | S )z ACTION_UP x, y r   rš   )rI   r…   r†   Ú	ACTION_UPr�   s      €€r2   Úupz _Device.touch.<locals>._Touch.upã   s4   ø€ à—‘ q¨!Ó,‘��1Ø—‘×,Ñ,¨Y¸¸1¸aÔ@Ø�r4   r|   c                 ó0   — t        j                  |«       | S ©N)r�   r‘   r€   s     r2   r‘   z#_Device.touch.<locals>._Touch.sleepé   s   € Ü—
‘
˜7Ô#Ø�r4   N)Ú__name__Ú
__module__Ú__qualname__rž   r¢   r¥   Úfloatr‘   )rœ   r¡   r¤   r�   s   €€€€r2   Ú_Touchr—   Ø   s   ø„ õõ
õ
ð Uô r4   r¬   ©Úobject)rI   r¬   rœ   r¡   r¤   r�   s     @@@@r2   Útouchz_Device.touchÊ   s3   û€ ð ˆØˆØˆ	àˆ÷	ñ 	”Vô 	ñ* ‹xˆr4   r…   r†   c                 ó²   — | j                  ||«      \  }}| j                  d«      5  | j                  j                  ||«       d d d «       y # 1 sw Y   y xY w)NÚclick)rŠ   r”   rT   r±   )rI   r…   r†   s      r2   r±   z_Device.clickï   sO   € Ø×Ñ  1Ó%‰ˆˆ1Ø×"Ñ" 7Ó+ñ 	%Ø�L‰L×Ñ˜q !Ô$÷	%÷ 	%ñ 	%ús   §AÁAc                 óÔ   — | j                  ||«      \  }}| j                  j                  ||«      j                  ||«       t	        j
                  |«       | j                  ||«       y)z'
        double click position
        N)rŠ   r¯   rž   r¥   r�   r‘   r±   ©rI   r…   r†   Údurations       r2   Údouble_clickz_Device.double_clickô   sS   € ð ×Ñ  1Ó%‰ˆˆ1Ø�
‰
�‰˜˜1Ó× Ñ   AÔ&Ü�
‰
�8ÔØ�
‰
�1�aÕr4   r´   c           	      óÌ   — | j                  ||«      \  }}| j                  d«      5  | j                  j                  ||t	        |dz  «      «       ddd«       y# 1 sw Y   yxY w)zulong click at arbitrary coordinates.
        
        Args:
            duration (float): seconds of pressed
        r±   éè  N)rŠ   r”   rT   r±   rH   r³   s       r2   Ú
long_clickz_Device.long_clický   s\   € ð ×Ñ  1Ó%‰ˆˆ1Ø×"Ñ" 7Ó+ñ 	9Ø�L‰L×Ñ˜q !¤S¨°$©Ó%7Ô8÷	9÷ 	9ñ 	9ús   §*AÁA#Ústepsc                 ó’  — |�|�t        j                  dt        «       d}|rt        |dz  «      }|st        }t
        j                  d|||||«       | j                  } |||«      \  }} |||«      \  }}t        d|«      }| j                  d«      5  | j                  j                  |||||«      cddd«       S # 1 sw Y   yxY w)a  
        Args:
            fx, fy: from position
            tx, ty: to position
            duration (float): duration
            steps: 1 steps is about 5ms, if set, duration will be ignore

        Documents:
            uiautomator use steps instead of duration
            As the document say: Each step execution is throttled to 5ms per step.

        Links:
            https://developer.android.com/reference/android/support/test/uiautomator/UiDevice.html#swipe%28int,%20int,%20int,%20int,%20int%29
        Nz=duration and steps can not be set at the same time, use stepséÈ   z*swipe from (%s, %s) to (%s, %s), steps: %dr=   Úswipe)ÚwarningsÚwarnÚUserWarningrH   r   r'   r{   rŠ   Úmaxr”   rT   r¼   )rI   ÚfxÚfyÚtxÚtyr´   r¹   Úrel2abss           r2   r¼   z_Device.swipe  sÆ   € ð Ð EÐ$5Ü�M‰MÐYÔ[fÔgØˆHÙÜ˜ 3™Ó'ˆEÙÜ ˆEÜ�‰ÐAÀ2ÀrÈ2ÈrÐSXÔYØ×"Ñ"ˆÙ˜˜R“‰ˆˆBÙ˜˜R“‰ˆˆBÜ�A�u“ˆØ×"Ñ" 7Ó+ñ 	=Ø—<‘<×%Ñ% b¨"¨b°"°eÓ<÷	=÷ 	=ò 	=ús   ÂB=Â=CÚpointsc                 óè   — g }| j                   }|D ]6  } ||d   |d   «      \  }}|j                  |«       |j                  |«       Œ8 t        |dz  «      }| j                  j	                  ||«      S )aN  
        Args:
            points: is point array containg at least one point object. eg [[200, 300], [210, 320]]
            duration: duration to inject between two points

        Links:
            https://developer.android.com/reference/android/support/test/uiautomator/UiDevice.html#swipe(android.graphics.Point[], int)
        r   r9   g{®Gázt?)rŠ   ÚappendrH   rT   ÚswipePoints)	rI   rÆ   r´   ÚppointsrÅ   Úpr…   r†   r¹   s	            r2   Úswipe_pointsz_Device.swipe_points%  sz   € ð ˆØ×"Ñ"ˆØò 	ˆAÙ˜1˜Q™4  1¡Ó&‰DˆAˆqØ�N‰N˜1ÔØ�N‰N˜1Õð	ô
 �H˜t‘OÓ$ˆØ�|‰|×'Ñ'¨°Ó7Ð7r4   c                 óî   — | j                   } |||«      \  }} |||«      \  }}| j                  d«      5  | j                  j                  ||||t	        |dz  «      «      cddd«       S # 1 sw Y   yxY w)z&Swipe from one point to another point.Údragr»   N)rŠ   r”   rT   rÎ   rH   )rI   ÚsxÚsyÚexÚeyr´   rÅ   s          r2   rÎ   z_Device.drag8  su   € à×"Ñ"ˆÙ˜˜R“‰ˆˆBÙ˜˜R“‰ˆˆBØ×"Ñ" 6Ó*ñ 	JØ—<‘<×$Ñ$ R¨¨R°´S¸ÀC¹Ó5HÓI÷	J÷ 	Jò 	Jús   ¶+A+Á+A4Úkeyc                 ó*  — | j                  d«      5  t        |t        «      rB|r| j                  j	                  ||«      n| j                  j	                  |«      cddd«       S | j                  j                  |«      cddd«       S # 1 sw Y   yxY w)a  
        press key via name or key code. Supported key name includes:
            home, back, left, right, up, down, center, menu, search, enter,
            delete(or del), recent(recent apps), volume_up, volume_down,
            volume_mute, camera, power.
        ÚpressN)r”   Ú
isinstancerH   rT   ÚpressKeyCodeÚpressKey)rI   rÓ   Úmetas      r2   rÕ   z_Device.press@  s}   € ð ×"Ñ" 7Ó+ñ 	2Ü˜#œsÔ#á"&ð —|‘|×0Ñ0Ø˜ôØ,0¯L©L×,EÑ,EÀcÓ,J÷	2ñ 	2ð
 —|‘|×,Ñ,¨SÓ1÷	2÷ 	2ò 	2ús   ’A	B	Á%B	Â	Bc                 óâ   — | j                  d«      5  t        |t        «      r| j                  d|z  «       n$|j	                  «       }| j                  d|› �«       ddd«       y# 1 sw Y   yxY w)zà
        long press key via name or key code

        Args:
            key: key name or key code
        
        Examples:
            long_press("home") same as "adb shell input keyevent --longpress KEYCODE_HOME"
        rÕ   zinput keyevent --longpress %dzinput keyevent --longpress N)r”   rÖ   rH   rG   Úupper)rI   rÓ   s     r2   Ú
long_pressz_Device.long_pressN  sf   € ð ×"Ñ" 7Ó+ñ 	@Ü˜#œsÔ#Ø—
‘
Ð:¸SÑ@ÕAà—i‘i“k�Ø—
‘
Ð8¸¸Ð>Ô?÷	@÷ 	@ñ 	@ús   ’A
A%Á%A.c                 ó8   — | j                   j                  «        y r§   )rT   ÚwakeUp©rI   s    r2   Ú	screen_onz_Device.screen_on_  s   € Ø�‰×ÑÕr4   c                 ó8   — | j                   j                  «        y r§   )rT   r‘   rß   s    r2   Ú
screen_offz_Device.screen_offb  s   € Ø�‰×ÑÕr4   c                 ó@   — | j                   | j                  d      d   S )a  
        orienting the device to left/right or natural.
        left/l:       rotation=90 , displayRotation=1
        right/r:      rotation=270, displayRotation=3
        natural/n:    rotation=0  , displayRotation=0
        upsidedown/u: rotation=180, displayRotation=2
        ÚdisplayRotationr9   )Ú_Device__orientationÚinforß   s    r2   Úorientationz_Device.orientatione  s$   € ð ×!Ñ! $§)¡)Ð,=Ñ">Ñ?ÀÑBÐBr4   Úvaluec                 ó‚   — | j                   D ]&  }||v sŒ| j                  j                  |d   «        y t        d«      ‚)úsetter of orientation property.r9   zInvalid orientation.N)rå   rT   ÚsetOrientationÚ
ValueError)rI   rè   Úvaluess      r2   rç   z_Device.orientationp  sG   € ð ×(Ñ(ò 	5ˆFØ˜Šà—‘×+Ñ+¨F°1©IÔ6Ùð		5ô Ð3Ó4Ð4r4   Úfreezedc                 ó:   — | j                   j                  |«       y r§   )rT   ÚfreezeRotation)rI   rî   s     r2   Úfreeze_rotationz_Device.freeze_rotation{  s   € Ø�‰×#Ñ# GÕ,r4   c                 ó6   — | j                   j                  «       S )z>get last traversed text. used in webview for highlighted text.)rT   ÚgetLastTraversedTextrß   s    r2   Úlast_traversed_textz_Device.last_traversed_text~  s   € ð �|‰|×0Ñ0Ó2Ð2r4   c                 ó8   — | j                   j                  «        y)zclear the last traversed text.N)rT   ÚclearLastTraversedTextrß   s    r2   Úclear_traversed_textz_Device.clear_traversed_textƒ  s   € à�‰×+Ñ+Õ-r4   c                 ó6   — | j                   j                  «       S r§   )rT   ÚgetLastToastrß   s    r2   Ú
last_toastz_Device.last_toast‡  ó   € à�|‰|×(Ñ(Ó*Ð*r4   c                 ó8   — | j                   j                  «        y r§   ©rT   ÚclearLastToastrß   s    r2   Úclear_toastz_Device.clear_toast‹  s   € Ø�‰×#Ñ#Õ%r4   c                 ó6   — | j                   j                  «       S r§   )rT   ÚopenNotificationrß   s    r2   Úopen_notificationz_Device.open_notificationŽ  s   € Ø�|‰|×,Ñ,Ó.Ð.r4   c                 ó6   — | j                   j                  «       S r§   )rT   ÚopenQuickSettingsrß   s    r2   Úopen_quick_settingsz_Device.open_quick_settings‘  s   € Ø�|‰|×-Ñ-Ó/Ð/r4   Úurlc                 ó2   — | j                  ddddd|g«       y )NÚamÚstartú-azandroid.intent.action.VIEWz-d)rG   )rI   r  s     r2   Úopen_urlz_Device.open_url”  s    € Ø�
‰
Ø�7˜DÐ">ÀÀcÐJõ	Lr4   c                 ó&   —  | di |¤Žj                   S ©Nr‰   )Úexists©rI   Úkwargss     r2   r  z_Device.exists˜  s   € Ù‰~�f‰~×$Ñ$Ð$r4   c                 ó6   — | j                   j                  «       S r§   )rT   ÚgetClipboardrß   s    r2   Ú	clipboardz_Device.clipboard›  rû   r4   Útextc                 ó&   — | j                  |«       y r§   )Úset_clipboard©rI   r  s     r2   r  z_Device.clipboardŸ  s   € à×Ñ˜4Õ r4   c                 ó<   — | j                   j                  ||«       y)z
        Args:
            text: The actual text in the clip.
            label: User-visible label for the clip data.
        N)rT   ÚsetClipboard)rI   r  Úlabels      r2   r  z_Device.set_clipboard£  s   € ð 	�‰×!Ñ! %¨Õ.r4   c                 ó8   — | j                   j                  «        y©z clear input text N)rT   ÚclearInputTextrß   s    r2   Ú
clear_textz_Device.clear_text«  s   € à�‰×#Ñ#Õ%r4   c                 óz   — || _         | j                   |k7  rt        d«      ‚| j                  j                  «        y)ú�
        send text to focused input area
        
        Args:
            text: input text
            clear: clear text before input
        zsetClipboard failedN)r  ÚUiAutomationErrorrT   ÚpasteClipboardr  s     r2   Ú	send_keysz_Device.send_keys¯  s3   € ð ˆŒØ�>‰>˜TÒ!Ü#Ð$9Ó:Ð:Ø�‰×#Ñ#Õ%r4   c                 óL   — |j                  «       }| j                  d|z   «       y)z:
        Args:
            v: eg home wakeup back
        zinput keyevent N)rÛ   rG   ©rI   Úvs     r2   Úkeyeventz_Device.keyevent¾  s!   € ð
 �G‰G‹IˆØ�
‰
Ð$ qÑ(Õ)r4   c                 óˆ   — | j                   r| j                   S | j                  ddg«      j                  j                  «       S )a­  
        If connected with USB, here should return self._serial
        When this situation happends

            d = u2.connect_usb("10.0.0.1:5555")
            d.serial # should be "10.0.0.1:5555"
            d.shell(['getprop', 'ro.serialno']).output.strip() # should uniq str like ffee123ca

        This logic should not change, because it used in tmq-service
        and if you break it, some people will not happy
        Úgetpropzro.serialno)Ú_serialrG   ÚoutputÚstriprß   s    r2   Úserialz_Device.serialÆ  s8   € ð �<Š<Ø—<‘<ÐØ�z‰z˜9 mÐ4Ó5×<Ñ<×BÑBÓDÐDr4   c                 ó,   — t        | t        di |¤Ž«      S r  )r   r   r  s     r2   Ú__call__z_Device.__call__×  s   € Ü˜œhÑ0¨Ñ0Ó1Ð1r4   )TT)NÚpillowN)FFNN)FNNr§   )çš™™™™™¹?)ç      à?)NN©T)rc   r   )7r¨   r©   rª   rå   ÚboolrJ   rM   r	   ÚstrrH   r[   rt   r   rj   ri   r«   r�   ÚpropertyrŠ   Ú
contextlibÚcontextmanagerr”   r¯   r   r±   rµ   r¸   r¼   r   r
   rÌ   rÎ   rÕ   rÜ   rà   râ   rç   Úsetterrñ   rô   r÷   rú   rÿ   r  r  r  r  r  r  r  r#  r'  r   r-  r/  r‰   r4   r2   r6   r6   2   sÒ  „ ð=€Mñ	L°ð 	LÈDó 	Lòñ
. 8¨C¡=ð .ÐV^Ð_bÑVcó .ñBÈÐQTÉð ÐnvÐw{Ñn|ð ð  ILó ñ6 Ð a¨qÔ1ñÐS[Ð\`ÑSað Ðmpò ó 2ðñ"- x°¡ð -À%ó -ð ñó ðð, ×Ññ¨sò ó ðð ñ"ó ð"ðH%�u˜U C˜ZÑ(ð %¨U°5¸#°:Ñ->ó %ó
ñ9¨ó 9ñ=¨h°u©oð =ÈXÐVYÉ]ó =ñ<8 4¨¨c°3¨h©Ñ#8ð 8ÀEó 8ó&Jñ2˜˜s C˜x™ó 2ð@˜e C¨ H™oó @ò"òð ðC˜Sò Có ðCð ×Ñð5 ò 5ó ð5ñ- tó -ð ñ3ó ð3ò.ð ð+˜H S™Mò +ó ð+ò&ò/ò0ðL˜Có Lò%ð ð+˜8 C™=ò +ó ð+ð ×Ñð!˜cò !ó ð!ó/ò&ð&˜có &ò*ð ðE˜ò Eó ðEô 2r4   r6   c                   ó8  — e Zd ZU eed<   d dededdfd„Zdefd„Zde	e   fd	„Z
d
„ Zdefd„Zd!defd„Zd"dede	e   dededef
d„Z	 	 d#dededefd„Zd$dedee   fd„Zdee   fd„Zdefd„Zg fd„Zdefd„Zdedefd„Zg dfd„Zdedeeef   fd„Zdefd„Zy)%Ú	_AppMixInÚ_device_server_portFÚpackage_nameÚattachrc   ÚSessionc                 ón   — | j                  || ¬«       t        | j                  || j                  ¬«      S )zÐ
        launch app and keep watching the app's state

        Args:
            package_name: package name
            attach: attach to existing session or not

        Returns:
            Session
        )Ústop©Úport)Ú	app_startr?  Ú
adb_devicer<  )rI   r=  r>  s      r2   Úsessionz_AppMixIn.sessionÞ  s/   € ð 	�‰�|¨f¨*ˆÔ5Ü�t—‘¨¸4×;SÑ;SÔTÐTr4   c                 ó  — | j                  d«      j                  }t        |j                  «       j	                  «       «      dk  r| j                  d«      j                  }|j                  «       j                  dd«      S )zQ
        Compatible with some devices that does not support `ps` command
        zps -Ar9   Úpsz
ú
)rG   r+  Úlenr,  Ú
splitlinesÚreplace)rI   r+  s     r2   Ú_compat_shell_psz_AppMixIn._compat_shell_psì  sa   € ð —‘˜GÓ$×+Ñ+ˆÜˆv�|‰|‹~×(Ñ(Ó*Ó+¨qÒ0Ø—Z‘Z Ó%×,Ñ,ˆFØ�|‰|‹~×%Ñ% f¨dÓ3Ð3r4   c                 óÜ   — | j                  «       }|j                  «       }|D ]G  }|j                  «       j                  «       }t	        |«      dk  rŒ0|d   |k(  sŒ9t        |d   «      c S  y)z,
        Return pid of package name
        é	   éÿÿÿÿr9   N)rM  rK  r,  ÚsplitrJ  rH   )rI   r=  r+  ÚlinesÚlineÚfieldss         r2   Ú
_pidof_appz_AppMixIn._pidof_appõ  sk   € ð ×&Ñ&Ó(ˆØ×!Ñ!Ó#ˆØò 	&ˆDà—Z‘Z“\×'Ñ'Ó)ˆFÜ�6‹{˜QŠØØ�b‰z˜\Ó)Ü˜6 !™9“~Ò%ñ	&r4   c                 óz   — | j                   j                  «       }|rt        j                  |«      S t	        d«      ‚)zÛ
        Returns:
            dict(package, activity, pid?)

        Raises:
            DeviceError

        For developer:
            Function reset_uiautomator need this function, so can't use jsonrpc here.
        zCouldn't get focused app)rE  Úapp_currentÚdataclassesÚasdictÚDeviceError)rI   ræ   s     r2   rW  z_AppMixIn.app_current  s6   € ð �‰×*Ñ*Ó,ˆÙÜ×%Ñ% dÓ+Ð+ÜÐ4Ó5Ð5r4   Údatac                 ó:   — | j                   j                  |«       y)ze
        Install app

        Args:
            data: can be file path or url or file object
        N)rE  Úinstall)rI   r[  s     r2   Úapp_installz_AppMixIn.app_install  s   € ð 	�‰×Ñ Õ%r4   c                 ó  — t        j                   «       |z   }t        j                   «       |k  rR| j                  «       j                  d«      }||k(  ryt        j                  d«       t        j                   «       |k  rŒRy)z¬ wait activity
        Args:
            activity (str): name of activity
            timeout (float): max wait time

        Returns:
            bool of activity
        ÚactivityTr2  F)r�   rW  Úgetr‘   )rI   r`  ÚtimeoutÚdeadlineÚcurrent_activitys        r2   Úwait_activityz_AppMixIn.wait_activity  sh   € ô —9‘9“; Ñ(ˆÜ�i‰i‹k˜HÒ$Ø#×/Ñ/Ó1×5Ñ5°jÓAÐØÐ+Ò+ØÜ�J‰J�rŒNô	 �i‰i‹k˜HÓ$ð
 r4   Nr`  ÚwaitrA  Ú
use_monkeyc           
      óð   — |r| j                  |«       |s|s+| j                  dd|dddg«       |r| j                  |«       yddd	d
ddd|› d|› �g}| j                  |«       |r| j                  |«       yy)al   Launch application
        Args:
            package_name (str): package name
            activity (str): app activity
            stop (bool): Stop app before starting the activity. (require activity)
            use_monkey (bool): use monkey command to start app when activity is not given
            wait (bool): wait until app started. default False
        Úmonkeyz-pz-cz android.intent.category.LAUNCHERÚ1Nr  r	  r
  zandroid.intent.action.MAINz-nú/)Úapp_stoprG   Úapp_wait)rI   r=  r`  rf  rA  rg  Úargss          r2   rD  z_AppMixIn.app_start-  s•   € ñ Ø�M‰M˜,Ô'á™XØ�J‰JØ˜$ ¨dØ2°Cðô ñ Ø—‘˜lÔ+Øð" �'˜4Ð!=¸tØ.Ø�\�N ! H :Ð.ð
ˆð
 	�
‰
�4ÔáØ�M‰M˜,Õ'ð r4   rb  c                 ój  — d}t        j                   «       |z   }t        j                   «       |k  r~|r(| j                  «       d   |k(  r5| j                  |«      }n#|| j                  «       v r| j                  |«      }|r|S t        j                  d«       t        j                   «       |k  rŒ~|xs dS )zý Wait until app launched
        Args:
            package_name (str): package name
            timeout (float): maxium wait time
            front (bool): wait until app is current app

        Returns:
            pid (int) 0 if launch failed
        NÚpackager9   r   )r�   rW  rU  Úapp_list_runningr‘   )rI   r=  rb  ÚfrontÚpidrc  s         r2   rm  z_AppMixIn.app_waitZ  s›   € ð ˆÜ—9‘9“; Ñ(ˆÜ�i‰i‹k˜HÒ$ÙØ×#Ñ#Ó% iÑ0°LÒ@ØŸ/™/¨,Ó7‘Cà 4×#8Ñ#8Ó#:Ñ:ØŸ/™/¨,Ó7�CÙØ�
Ü�J‰J�qŒMô �i‰i‹k˜HÓ$ð Šx�aˆr4   Úfilterc                 ót   — | j                  ddd|g«      \  }}t        j                  d|«      }t        |«      S )zÏ
        List installed app package names

        Args:
            filter: [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
        
        Returns:
            list of apps by filter
        ÚpmÚlistÚpackagesúpackage:([^\s]+))rG   ÚreÚfindallrw  )rI   rt  r+  Ú_rx  s        r2   Úapp_listz_AppMixIn.app_listv  s:   € ð —J‘J  f¨j¸&ÐAÓB‰	ˆ�Ü—:‘:Ð1°6Ó:ˆÜ�H‹~Ðr4   c                 ó  — | j                  d«      \  }}t        j                  d|«      }| j                  «       }t        j                  d|t        j                  «      }t        t        |«      j                  |«      «      S )z;
        Returns:
            list of running apps
        zpm list packagesry  z(\S+)$)rG   rz  r{  rM  ÚMrw  ÚsetÚintersection)rI   r+  r|  rx  Ú	ps_outputÚprocess_namess         r2   rq  z_AppMixIn.app_list_running„  sf   € ð
 —J‘JÐ1Ó2‰	ˆ�Ü—:‘:Ð1°6Ó:ˆØ×)Ñ)Ó+ˆ	ÜŸ
™
 9¨i¼¿¹Ó>ˆÜ”C˜“M×.Ñ.¨}Ó=Ó>Ð>r4   c                 ó:   — | j                   j                  |«       y)z Stop one application N)rE  rl  ©rI   r=  s     r2   rl  z_AppMixIn.app_stop�  s   € à�‰× Ñ  Õ.r4   c                 ó¦   — ddg}t        | j                  «       «      j                  ||z   «      }|D ]  }| j                  |«       Œ t	        |«      S )z¨ Stop all third party applications
        Args:
            excludes (list): apps that do now want to kill

        Returns:
            a list of killed apps
        úcom.github.uiautomatorúcom.github.uiautomator.test)r€  rq  Ú
differencerl  rw  )rI   ÚexcludesÚour_appsÚ	kill_pkgsÚpkg_names        r2   Úapp_stop_allz_AppMixIn.app_stop_all“  s^   € ð -Ð.KÐLˆÜ˜×-Ñ-Ó/Ó0×;Ñ;¸HØ<Dñ=Eó Fˆ	à!ò 	$ˆHØ�M‰M˜(Õ#ð	$ä�I‹Ðr4   c                 ó:   — | j                   j                  |«       y)z# Stop and clear app data: pm clear N)rE  Ú	app_clearr…  s     r2   r�  z_AppMixIn.app_clear¢  s   € à�‰×!Ñ! ,Õ/r4   c                 óH   — | j                  dd|g«      }|j                  dk(  S )zG Uninstall an app 

        Returns:
            bool: success
        rv  Ú	uninstallr   )rG   Ú	exit_code)rI   r=  Úrets      r2   Úapp_uninstallz_AppMixIn.app_uninstall¦  s(   € ð �j‰j˜$ ¨\Ð:Ó;ˆØ�}‰} Ñ!Ð!r4   c                 ó.  — ddg}| j                  g d¢«      \  }}t        j                  d|«      }t        |«      j	                  ||z   «      }t        |«      }|D ]7  }|rt        d|ddd¬	«       | j                  |«      }|sŒ)t        |rd
nd«       Œ9 |S )z Uninstall all apps r‡  rˆ  )rv  rw  rx  z-3ry  Úuninstallingú ry   T)ÚendÚflushÚOKÚFAIL)rG   rz  r{  r€  r‰  rw  Úprintr•  )	rI   rŠ  Úverboser‹  r+  r|  Úpkgsr�  Úoks	            r2   Úapp_uninstall_allz_AppMixIn.app_uninstall_all¯  s›   € à,Ð.KÐLˆØ—J‘JÒ?Ó@‰	ˆ�Ü�z‰zÐ-¨vÓ6ˆÜ�4‹y×#Ñ# H¨xÑ$7Ó8ˆÜ�D‹zˆØò 	.ˆHÙÜ�n h°¸À4ÕHØ×#Ñ# HÓ-ˆBÚÜ™b‘d fÕ-ð	.ð ˆr4   c                 ó†   — | j                   j                  |«      }|st        d|«      ‚|j                  |j                  dœS )a  
        Get app info

        Args:
            package_name (str): package name

        Return example:
            {
                "versionName": "1.1.7",
                "versionCode": 1001007
            }

        Raises:
            AppNotFoundError
        zApp not installed)ÚversionNameÚversionCode)rE  Úapp_infoÚAppNotFoundErrorÚversion_nameÚversion_code)rI   r=  ræ   s      r2   r¥  z_AppMixIn.app_info¿  sE   € ð  �‰×'Ñ'¨Ó5ˆÙÜ"Ð#6¸ÓEÐEà×,Ñ,Ø×,Ñ,ñ
ð 	
r4   c                 ó�  — | j                  ddg«      j                  j                  «       }|j                  «       rt	        |«      nd}|€t
        j                  d«       y|dk  rt
        j                  d«       y| j                  dd|g«      j                  }t        j                  d	|«      }|st
        j                  d
«       yt	        |j                  d«      «      }|dk  rt
        j                  d«       yt        j                  d|«      }|D ]/  }| j                  dd||g«       t
        j                  d|› �«       Œ1 y)a²   auto grant permissions

        Args:
            package_name (str): package name
        
        Help of "adb shell pm":
            grant [--user USER_ID] PACKAGE PERMISSION
            revoke [--user USER_ID] PACKAGE PERMISSION
                These commands either grant or revoke permissions to apps.  The permissions
                must be declared as used in the app's manifest, be runtime permissions
                (protection level dangerous), and the app targeting SDK greater than Lollipop MR1 (API level 22).
        
        Help of "Android official pm" see <https://developer.android.com/tools/adb#pm>
            Grant a permission to an app. On devices running Android 6.0 (API level 23) and higher,
              the permission can be any permission declared in the app manifest.
            On devices running Android 5.1 (API level 22) and lower,
              must be an optional permission defined by the app.
        r)  zro.build.version.sdkNzcan't get sdk versioné   z:auto grant permissions only support android 6.0+ (API 23+)Údumpsysrp  ztargetSdk=(\d+)z(can't get targetSdk from dumpsys packager9   é   z7auto grant permissions only support app targetSdk >= 22z/(android\.\w*\.?permission\.\w+): granted=falserv  Úgrantzauto grant permission )rG   r+  r,  ÚisdigitrH   r'   rk   rz  ÚsearchÚgroupr{  ræ   )	rI   r=  Úsdk_version_outputÚsdk_versionÚdumpsys_package_outputÚtarget_sdk_matchÚ
target_sdkÚpermissionsÚ
permissions	            r2   Úapp_auto_grant_permissionsz$_AppMixIn.app_auto_grant_permissions×  s(  € ð& "ŸZ™Z¨Ð4JÐ(KÓL×SÑS×YÑYÓ[ÐØ1C×1KÑ1KÔ1M”cÐ,Ô-ÐSWˆØÐÜ�N‰NÐ2Ô3ØØ˜Òä�N‰NÐWÔXØà!%§¡¨Y¸	ÀLÐ,QÓ!R×!YÑ!YÐÜŸ9™9Ð%7Ð9OÓPÐÙÜ�N‰NÐEÔFØÜÐ)×/Ñ/°Ó2Ó3ˆ
Ø˜Š?Ü�N‰NÐTÔUØä—j‘jÐ!SÐUkÓlˆØ%ò 	?ˆJØ�J‰J˜˜g |°ZÐ@ÔAÜ�K‰KÐ0°°Ð=Õ>ñ	?r4   ©F)é
   )NFFF)g      4@Fr§   )r¨   r©   rª   rH   Ú__annotations__r5  r4  rF  rM  r	   rU  rW  r^  re  rD  r«   rm  r   r}  rq  rl  rŽ  r�  r•  r¡  r   r   r¥  r¸  r‰   r4   r2   r;  r;  Û  sI  … ØÓñU Cð U°ð UÀ)ó Uð4 #ó 4ð&¨(°3©-ó &ò6ð & ó &ñ°Tó ñ"+( cð +(°X¸c±]ð +(ÐQUð +(Ðeið +(ð  @Dó +(ð^ #'ØñØ"ðàðð "%óñ8˜sð ¨d°3©ió ð	? $ s¡)ó 	?ð/ Só /ð %'ó ð0 có 0ð"¨#ð "°$ó "ð *,°Uó ð 
 Sð 
¨T°#°s°(©^ó 
ð0*?°sô *?r4   r;  c                   óÞ   — e Zd Zed„ «       Zej
                  deeef   fd„«       Zed„ «       Z	e	j
                  deeef   fd„«       Z	d„ Z
dd„Z ed¬	«      dd
„«       Zed„ «       Zdefd„Zy)Ú_DeprecatedMixInc                 ó    — | j                   d   S ©Nr~   r   rß   s    r2   r~   z_DeprecatedMixIn.wait_timeout  s   € à�}‰}˜^Ñ,Ð,r4   r&  c                 ó"   — || j                   d<   y r¿  r   r%  s     r2   r~   z_DeprecatedMixIn.wait_timeout	  s   € à()ˆ�‰�nÒ%r4   c                 ó    — | j                   d   S )z2 Deprecated or not deprecated, this is a question Ú
post_delayr   rß   s    r2   Úclick_post_delayz!_DeprecatedMixIn.click_post_delay  s   € ð �}‰}˜\Ñ*Ð*r4   c                 ó"   — || j                   d<   y )NrÂ  r   r%  s     r2   rÃ  z!_DeprecatedMixIn.click_post_delay  s   € à&'ˆ�‰�lÒ#r4   c                 ón   — | j                   d   s&| j                  d«       | j                  dddd«       yy)z8 unlock screen with swipe from left-bottom to right-top ÚscreenOnzinput keyevent POWERr1  gÍÌÌÌÌÌì?N)ræ   rG   r¼   rß   s    r2   Úunlockz_DeprecatedMixIn.unlock  s2   € à�y‰y˜Ò$à�J‰JÐ-Ô.Ø�J‰J�s˜C  cÕ*ð %r4   c                 ó   — t        d«       y)u7    æ˜¾ç¤ºæ‚¬æµ®çª—ï¼Œæ��é«˜uiautomatorè¿�è¡Œçš„ç¨³å®šæ€§ z;show_float_window is deprecated, this is not needed anymoreN)r�  )rI   Úshows     r2   Úshow_float_windowz"_DeprecatedMixIn.show_float_window  s   € äÐKÕLr4   z(use d.toast.show(text, duration) instead)Úreasonc                 ó@   — | j                   j                  ||dz  «      S )zx Show toast
        Args:
            text (str): text to show
            duration (float): seconds of display
        r·   ©rT   Ú	makeToast)rI   r  r´   s      r2   Ú
make_toastz_DeprecatedMixIn.make_toast!  s   € ð �|‰|×%Ñ% d¨H°t©OÓ<Ð<r4   c                 ó8   ‡— | Š G ˆfd„dt         «      } |«       S )Nc                   ó6   •— e Zd Z	 	 	 dˆ fd„	Zˆ fd„Zdˆ fd„	Zy)ú%_DeprecatedMixIn.toast.<locals>.ToastNc                 óÎ   •— t        j                   «       |z   }	 ‰j                  j                  «       }|r|S t        j                   «       |kD  r|S t        j                  d«       ŒM)a?  
                Args:
                    wait_timeout: seconds of max wait time if toast now show right now
                    cache_timeout: depreacated
                    default: default messsage to return when no toast show up

                Returns:
                    None or toast message
                r2  )r�   rT   rù   r‘   )rI   r~   Úcache_timeoutÚdefaultrc  Úmessager�   s         €r2   Úget_messagez1_DeprecatedMixIn.toast.<locals>.Toast.get_message/  sU   ø€ ô  Ÿ9™9›;¨Ñ5�ØØ!Ÿk™k×6Ñ6Ó8�GÙØ&˜Ü—y‘y“{ XÒ-Ø&˜Ü—J‘J˜r”Nð r4   c                 ó8   •— ‰j                   j                  «       S r§   rý   )rI   r�   s    €r2   Úresetz+_DeprecatedMixIn.toast.<locals>.Toast.resetE  s   ø€ Ø—{‘{×1Ñ1Ó3Ð3r4   c                 óB   •— ‰j                   j                  ||dz  «      S )Nr·   rÍ  )rI   r  r´   r�   s      €r2   rÉ  z*_DeprecatedMixIn.toast.<locals>.Toast.showH  s   ø€ Ø—{‘{×,Ñ,¨T°8¸d±?ÓCÐCr4   )rº  rº  N©g      ð?)r¨   r©   rª   r×  rÙ  rÉ  )r�   s   €r2   ÚToastrÒ  .  s   ø„ à)+Ø*,Ø$(õ#ô,4öDr4   rÜ  r­   )rI   rÜ  r�   s     @r2   Útoastz_DeprecatedMixIn.toast*  s   ø€ àˆö	D”Fô 	Dñ: ‹wˆr4   rè   c                 ó   — || _         y)rê   N)rç   )rI   rè   s     r2   Úset_orientationz _DeprecatedMixIn.set_orientationM  s
   € à ˆÕr4   Nr3  rÛ  )r¨   r©   rª   r6  r~   r9  r   rH   r«   rÃ  rÇ  rÊ  r   rÏ  rÝ  r5  rß  r‰   r4   r2   r½  r½    sÃ   „ Øñ-ó ð-ð ×Ñð*˜e C¨ JÑ/ò *ó ð*ð ñ+ó ð+ð ×Ñð( %¨¨U¨
Ñ"3ò (ó ð(ò+óMñ ÐAÔBò=ó Cð=ð ñ ó ð ðD! Sô !r4   r½  c                   ó˜   — e Zd Zddededefd„Zedefd„«       Zede	j                  fd„«       Z	ed„ «       Zed„ «       Zedefd	„«       Zy
)Ú_PluginMixInÚ	autostartÚbuiltinrc   c                 óD   — t        | |¬«      }|r|j                  «        |S )N)rã  )r"   r	  )rI   râ  rã  Úwcs       r2   Úwatch_contextz_PluginMixIn.watch_contextS  s   € Ü˜$¨Ô0ˆÙØ�H‰HŒJØˆ	r4   c                 ó   — t        | «      S r§   )r#   rß   s    r2   Úwatcherz_PluginMixIn.watcherY  s   € ä�t‹}Ðr4   c                 ó,   — t        j                  | «      S r§   )r   Ú
XPathEntryrß   s    r2   r   z_PluginMixIn.xpath]  s   € ä×Ñ Ó%Ð%r4   c                 ó0   — ddl m} |j                  | «      S )Nr   )Úimage)Úuiautomator2rì  ÚImageX)rI   Ú_images     r2   rì  z_PluginMixIn.imagea  s   € å0Ø�}‰}˜TÓ"Ð"r4   c                 ó0   — ddl m} |j                  | «      S )Nr   )Úscreenrecord)rí  rñ  ÚScreenrecord)rI   Ú_srs     r2   rñ  z_PluginMixIn.screenrecordf  s   € å4Ø×Ñ Ó%Ð%r4   c                 ó   — t        | «      S r§   r   rß   s    r2   Ú	swipe_extz_PluginMixIn.swipe_extk  s   € ä˜‹~Ðr4   N)TF)r¨   r©   rª   r4  r"   ræ  r   r#   rè  r   rê  rì  rñ  r   rõ  r‰   r4   r2   rá  rá  R  s›   „ ñ tð ¸Tð Èló ð ð˜ò ó ðð ð&�u×'Ñ'ò &ó ð&ð ñ#ó ð#ð ñ&ó ð&ð ð˜8ò ó ñr4   rá  c                   ó(   — e Zd ZdZd„ Zddedefd„Zy)ÚDevicez Device object c                 óz   — | j                  «       rt        j                  | «       yt        j                  | «       yr  )Úis_input_ime_installedr   r  r6   rß   s    r2   r  zDevice.clear_texts  s*   € à×&Ñ&Ô(Ü×'Ñ'¨Õ-ä×Ñ˜tÕ$r4   r  Úclearc                 óÞ   — |r| j                  «        | j                  «       rt        j                  | |«       y	 t        j                  | |«       y#  t        j                  | |«       Y yxY w)r   N)r  rù  r   r#  r6   )rI   r  rú  s      r2   r#  zDevice.send_keysz  s\   € ñ Ø�O‰OÔØ×&Ñ&Ô(Ü×&Ñ& t¨TÔ2Øð	3Ü×Ñ˜d DÕ)øð	3ä×&Ñ& t¨TÖ2ús   »A ÁA,Nr¹  )r¨   r©   rª   Ú__doc__r  r5  r4  r#  r‰   r4   r2   r÷  r÷  p  s   „ Ùò%ñ3˜cð 3¨$ô 3r4   r÷  c            	       óœ   ‡ — e Zd ZdZdej
                  dedefˆ fd„Zde	fd„Z
edefd„«       Zdd	ed
ededefˆ fd„Zd„ Zd„ Zd„ Zd„ Zˆ xZS )r?  zhSession keeps watch the app status
    each jsonrpc call will check if the package is still running
    Údevr=  rC  c                 óv   •— t         ‰| �  ||¬«       || _        | j                  | j                  «      | _        y )NrB  )ÚsuperÚ__init__Ú_package_namerm  Ú_pid)rI   rþ  r=  rC  Ú	__class__s       €r2   r  zSession.__init__’  s3   ø€ Ü‰Ñ˜ 4ÐÔ(Ø)ˆÔØ—M‘M $×"4Ñ"4Ó5ˆ�	r4   rc   c                 óR   — | j                   | j                  | j                  «      k(  S r§   )r  rU  r  rß   s    r2   ÚrunningzSession.running—  s    € Ø�y‰y˜DŸO™O¨D×,>Ñ,>Ó?Ñ?Ð?r4   c                 ó   — | j                   S r§   )r  rß   s    r2   rs  zSession.pidš  s   € à�y‰yÐr4   ÚmethodÚparamsrb  c                 ó’   •— | j                  «       s&t        d| j                  › d| j                  › d�«      ‚t        ‰| �  |||«      S )Nzapp:z pid:z is quit)r  ÚSessionBrokenErrorr  r  r   Újsonrpc_call)rI   r  r	  rb  r  s       €r2   r  zSession.jsonrpc_callž  sE   ø€ Ø�|‰|Œ~Ü$ t¨D×,>Ñ,>Ð+?¸uÀTÇYÁYÀKÈxÐ%XÓYÐYÜ‰wÑ# F¨F°GÓ<Ð<r4   c                 ó€   — | j                  | j                  dd¬«       | j                  | j                  «      | _        y)z restart app T)rf  rA  N)rD  r  rU  r  rß   s    r2   ÚrestartzSession.restart£  s0   € à�‰�t×)Ñ)°¸4ˆÔ@Ø—O‘O D×$6Ñ$6Ó7ˆ�	r4   c                 óH   — | j                  | j                  «       d| _        y)z close app N)rl  r  r  rß   s    r2   ÚclosezSession.close¨  s   € à�‰�d×(Ñ(Ô)Øˆ�	r4   c                 ó   — | S r§   r‰   rß   s    r2   Ú	__enter__zSession.__enter__­  s   € Øˆr4   c                 ó$   — | j                  «        y r§   )r  )rI   Úexc_typeÚexc_valÚexc_tbs       r2   Ú__exit__zSession.__exit__°  s   € Ø�
‰
�r4   )Nrº  )r¨   r©   rª   rü  ÚadbutilsÚ	AdbDevicer5  rH   r  r4  r  r6  rs  r   r«   r  r  r  r  r  Ú__classcell__)r  s   @r2   r?  r?  Ž  s‡   ø„ ñð6˜H×.Ñ.ð 6¸cð 6Èõ 6ð
@˜ó @ð ð�Sò ó ðñ= 3ð =°ð =ÀUð =ÐTWõ =ò
8ò
ò
ör4   r?  rB  r-  rC  rc   c                óJ   — | st        j                  d«      } t        | |¬«      S )a2  
    Args:
        serial (str): Android device serialno or adb device instance
        port (int): uiautomator2 server port on device

    Returns:
        Device

    Raises:
        ConnectError

    Example:
        connect("10.0.0.1:5555")
        connect("cff1123ea")  # adb device serial number
    ÚANDROID_SERIALrB  )ÚosÚgetenvÚconnect_usb©r-  rC  s     r2   Úconnectr!  ´  s#   € ñ  Ü—‘Ð+Ó,ˆÜ�v DÔ)Ð)r4   c                ó\   — | st         j                  j                  «       } t        | |¬«      S )zÈ
    Args:
        serial (str): android device serial or adb device instance
        port (int): uiautomator2 server port on device

    Returns:
        Device

    Raises:
        ConnectError
    rB  )r  ÚadbÚdevicer÷  r   s     r2   r  r  É  s&   € ñ Ü—‘×$Ñ$Ó&ˆÜ�&˜tÔ$Ð$r4   r§   )LÚ
__future__r   r   rV   r7  rX  rY   r)   r  rz  r�   r½   Ú	functoolsr   Útypingr   r   r   r	   r
   r   r  Úlxmlr   ÚPILr   r   rí  r   Úuiautomator2._inputr   Úuiautomator2._protor   r   r   Úuiautomator2._selectorr   r   Úuiautomator2.abstractr   r   r   Úuiautomator2.baser   Úuiautomator2.corer   Úuiautomator2.exceptionsÚuiautomator2.settingsr   Úuiautomator2.swiper   Úuiautomator2.utilsr   r    r!   Úuiautomator2.watcherr"   r#   rH   r  r$   Ú	getLoggerr¨   r'   ÚDEBUGr3   r6   r;  r½  rá  r÷  r?  r5  r  r!  r  r‰   r4   r2   ú<module>r7     s^  ð÷ 7ã Û Û Û 	Û Û 	Û 	Û Û Ý %ß :× :ã Ý Ý Ý å Ý 0ß EÑ Eß 5ß YÑ YÝ )Ý 1Ü %Ý *Ý 'ß FÑ Fß 6á˜i˜bŸi™iÐ(AÀ2ÓFÓGÐ à	ˆ×	Ñ	˜8Ó	$€à '§¡ó ôf2ˆkô f2ôRf?�ô f?÷R	K!ñ K!÷\ñ ô<3ˆW�i Ð/?ÐAQô 3ô<#ˆfô #ðL*ÐJ]ò *�E˜#˜x×1Ñ1Ð1Ñ2ð *ÀCð *Ðbhó *ð*%ÐTgò %˜˜c 8×#5Ñ#5°tÐ;Ñ<ð %Ècð %Ðlrô %r4   