
    %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      Y/var/www/oz-panel.ru/ozpay-pub/venv/lib/python3.12/site-packages/uiautomator2/__init__.pyenable_pretty_loggingr3   (   sP    ??'')%%&xy	Y''"
OOE    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lZ   )   
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

6s<7H6I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!    yy$$&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5a<K **;7**RZZ%89))..!.<ii**j*AGLL"Wf--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  MM+6	--j)^TG
 ##GNN7$;<DnnTw`deGnnW-G # 	uNN9:tG	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 )N2    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!ll66z9MGll66z9n]Gb=%&?@@ (72LLJK%&PQQr4   secondsc                 B    |r|| j                   d<   | j                   d   S )zset 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$     ,3DMM.)}}^,,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}    6M66M6AQ$$&( 1uQ!$1uQ!$a4Kr4    )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 MFELL;~&6l6(!LMJJvLL;~&6mE7!LMJJu 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1a@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+ 	%LL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

1a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LLq!S$%78	9 	9 	9s   *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MMY[fgH3'E EA2r2rSXY""RBRBAu""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{Gzt?)r   appendrH   rT   swipePoints)	rI   r   r   ppointsr   pr   r   r   s	            r2   swipe_pointsz_Device.swipe_points%  sz     "" 	A1Q41&DAqNN1NN1	
 HtO$||''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,0LL,E,Ec,J	2 	2
 ||,,S1	2 	2 	2s   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iik

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     (( 	5F++F1I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     

7D">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!    
 GGI

$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     <<<<zz9m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
.8C= .V^_bVc .BQT nvw{n|   IL 6 aq1S[\`Sa mp  2"-x -% -  , s   " "H%uUCZ( %U5#:-> %
9 9=huo =XVY] =<84c3h#8 8E 8&J2sCx 2@eCHo @" CS C C 5 5 5-t - 3 3. +HSM + +&/0LC L% +8C= + + !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ZZ%,,F||~%%fd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ZZ\'')F6{Qbz\)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     99;(iikH$#//155jA++JJrN	 iikH$
 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     MM,'XJJ$d2C  l+" '4!=t.\N!H:.

 	

4MM,' 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     99;(iikH$##%i0L@//,7C4#8#8#:://,7C
JJqM iikH$ xa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:     JJfj&AB	::16: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    
 JJ12	::16:))+	

9i>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MM(#	$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(     jj$\:;}}!!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JJ?@	zz-v64y##Hx$78Dz 	.Hnh4H##H-Bbdf-	. 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(   & "ZZ4J(KLSSYY[1C1K1K1Mc,-SWNN23NNWX!%Y	L,Q!R!Y!Y99%79OPNNEF)//23
?NNTUjj!SUkl% 	?JJJg|Z@AKK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 +(Xc] +(QU +(ei +(  @D +(^ #'" "%8s d3i 	?$s) 	?/S / %' 0c 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    yy$JJ-.JJsC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     ||%%dHtO<<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      99;5!kk668G&yy{X-&JJrN 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    {{,,T8d?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    - - *eC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HHJ	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\     OO&&(&&tT2	3dD)	3&&tT2s   A A,Nr  )r   r   r   __doc__r  r5  r4  r#  r   r4   r2   r  r  p  s    %3c 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()MM$"4"45	r4   rc   c                 R    | j                   | j                  | j                        k(  S r   )r  rU  r  r   s    r2   runningzSession.running  s     yyDOOD,>,>???r4   c                     | j                   S r   )r  r   s    r2   rs  zSession.pid  s    yy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    ||~$tD,>,>+?uTYYKx%XYYw#FFG<<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@OOD$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    6H.. 6c 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#      +,vD))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ibii(A2FG 			8	$ ' f2k f2Rf? f?R	K! K!\ <3Wi/?AQ 3<#f #L*J] *E#x1112 *C *bh **%Tg %c8#5#5t;< %c %lr %r4   