
    %j                         d dl mZm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mZmZ d dlmZ d dlmZmZmZ d dl d d	lmZ d d
lmZmZm Z   ejB                  e"      Z# G d de      Z$y)    )absolute_importprint_functionN)cached_property)AnyDictListOptionalTupleUnion)HTTP_TIMEOUTSCROLL_STEPS	Direction)ShellResponse)DEFAULT_SERVER_PORTBasicUiautomatorServer
check_port)*Settings)
deprecatedimage_convertlist2cmdlinec                      e Zd ZdZdeddeeeej                  f      de
fdZedefd       Zddej                  fd	Zedej                  fd
       Zedefd       ZdefdZddeeee   f   defdZedeeef   fd       Zedeeef   fd       Zedee   fd       Zed        Zd ZddefdZdedefdZ y)_BaseClientuF   
    提供最基础的控制类，这个类暂时先不公开吧
    N)portserialr   c                
   t        |       t        |t        j                        r|j                  | _        || _        n|| _        | j                         | _        d| _        t        j                  | | j                  |       y)zp
        Args:
            serial: device serialno
            port: uiautomator2 server port on device
        F)devdevice_server_portN)r   
isinstanceadbutils	AdbDevicer   _BaseClient__serial_dev_wait_for_device_debugr   __init__)selfr   r   s      U/var/www/oz-panel.ru/ozpay-pub/venv/lib/python3.12/site-packages/uiautomator2/base.pyr'   z_BaseClient.__init__   sc     	4fh001"MMDMDI"DM--/DI''$))PTU    returnc                     | j                   S N)r#   r(   s    r)   _serialz_BaseClient._serial*   s    }}r*   c                    t         j                  j                         D ]  }|j                  | j                  k(  s|c S  t        j                  d      }|j                  | j                        du}t         j                  }t        j                         |z   }t        j                         |k  r|rdnd}t        j                  d||t        j                         z
         |r9	 |j                  | j                         |j                  | j                  d       	 |j#                  | j                  d       |j%                  | j                        S t'        d
| j                   d      # t         j                  t         j                  f$ r?}t        j                  dt        |             t        j                   d	       Y d}~3d}~ww xY w# t         j                  t         j                  f$ r Y aw xY w)z
        wait for device came online, if device is remote, reconnect every 1s

        Returns:
            adbutils.AdbDevice
        
        Raises:
            ConnectError
        z(^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+$Nzdevice reconnectingzwait-for-devicez%s, time left(%.1fs)   timeoutzadb reconnect error: %sg      ?zdevice z not online)r!   adbdevice_listr   r/   recompilematchtimeloggerdebug
disconnectconnectAdbError
AdbTimeoutstrsleepwait_fordeviceConnectError)	r(   r3   d_RE_remote_adb
_is_remoter4   deadlinetitlees	            r)   r%   z_BaseClient._wait_for_device.   s    ))+ 	Axx4<<'	 $OP#))$,,7tC
ll99;(iikH$-7)=NELL/499;8NONN4<<0KKaK8
T\\15 ::dll++WT\\N+>?? !))8+>+>? LL!:CFCJJsO %%x':':; s*   &8E0 G 0#G4GG#G<;G<c                     | j                   S r-   )r$   r.   s    r)   
adb_devicez_BaseClient.adb_deviceS   s    yyr*   c                     t        |       S r-   r   r.   s    r)   settingsz_BaseClient.settingsW   s    ~r*   secondsc                 .    t        j                  |       y)z same as time.sleep N)r9   rA   )r(   rO   s     r)   rA   z_BaseClient.sleep[   s    

7r*   cmdargsc                 J   	 | j                   rt        dt        |             t        j                  dt        |             | j                  j                  ||      }t        |j                  |j                        S # t        j                  $ r}t        |      d}~ww xY w)a!  
        Run shell command on device

        Args:
            cmdargs: str or list, example: "ls -l" or ["ls", "-l"]
            timeout: seconds of command run, works on when stream is False

        Returns:
            ShellResponse

        Raises:
            AdbShellError
        zshell:z	shell: %sr2   N)r;   printr   r:   r$   shell2r   output
returncoder!   r>   AdbShellError)r(   rQ   r3   retrJ   s        r)   shellz_BaseClient.shell_   s    	#zzhW 56LLl7&;<))""7G"<C S^^<<   	#""	#s   A<A? ?B"BB"c                 :    | j                   j                  d      S )N
   )http_timeout)jsonrpc
deviceInfor.   s    r)   infoz_BaseClient.infov   s    ||&&B&77r*   c                    | j                   j                  d      }| j                   j                  d      }| j                   j                  d      }| j                   j                  d      }| j                   j                  d      }| j                   j                  d      }||j                         rt        |      nd ||||j                         rt        |      dS d dS )Nzro.serialnozro.build.version.sdkzro.build.version.releasezro.product.brandzro.product.modelzro.product.cpu.abi)r   sdkbrandmodelarchversion)r$   getpropisdigitint)r(   r   ra   re   rb   rc   rd   s          r)   device_infoz_BaseClient.device_infoz   s    ""=1ii 67))##$>?		!!"45		!!"45yy  !56"{{}3s8$'.'8s7|
 	
 ?C
 	
r*   c                 j    	 | j                   j                         S # t        j                  $ r Y y w xY wr-   )r$   wlan_ipr!   r>   r.   s    r)   rk   z_BaseClient.wlan_ip   s2    	99$$&&   		s    22c                 &     G d d      } ||       S )Nc                   $    e Zd ZdefdZd Zd Zy)+_BaseClient.jsonrpc.<locals>.JSONRpcWrapperserverc                      || _         d | _        y r-   )ro   method)r(   ro   s     r)   r'   z4_BaseClient.jsonrpc.<locals>.JSONRpcWrapper.__init__   s    $"r*   c                     || _         | S r-   )rq   )r(   rq   s     r)   __getattr__z7_BaseClient.jsonrpc.<locals>.JSONRpcWrapper.__getattr__   s    $r*   c                     |j                  dt              }|r|n|}| j                  j                  | j                  ||      S )Nr\   )popr   ro   jsonrpc_callrq   )r(   argskwargsr\   paramss        r)   __call__z4_BaseClient.jsonrpc.<locals>.JSONRpcWrapper.__call__   s8    %zz.,G!%6{{//V\RRr*   N)__name__
__module____qualname__r   r'   rs   rz    r*   r)   JSONRpcWrapperrn      s    #'= #Sr*   r   r~   )r(   r   s     r)   r]   z_BaseClient.jsonrpc   s    	S 	S d##r*   c                 D    | j                          | j                          y)a
  
        restart uiautomator service

        Orders:
            - stop uiautomator keeper
            - am force-stop com.github.uiautomator
            - start uiautomator keeper(am instrument -w ...)
            - wait until uiautomator service is ready
        N)stop_uiautomatorstart_uiautomatorr.   s    r)   reset_uiautomatorz_BaseClient.reset_uiautomator   s     	 r*   dstc                 T    | j                   j                  j                  |||       y)z
        Push file into device

        Args:
            src (path or fileobj): source file
            dst (str): destination can be folder or file path
            mode (int): file mode
        )modeN)r$   syncpush)r(   srcr   r   s       r)   r   z_BaseClient.push   s!     			C40r*   r   c                     	 | j                   j                  j                  ||d       y# t        $ r) | j                   j                  j                  ||       Y yw xY w)z0
        Pull file from device to local
        T)exist_okN)r$   r   pull	TypeError)r(   r   r   s      r)   r   z_BaseClient.pull   sK    	*IINNS48 	*IINNS)	*s   (+ /AAr-   )r[   )<   )i  )!r{   r|   r}   __doc__r   r	   r   r@   r!   r"   rh   r'   propertyr/   r%   rL   r   r   rN   floatrA   r   r   rY   r   r   r_   ri   rk   r]   r   r   r   r~   r*   r)   r   r      sq   V_r Vxc83E3E.E(FG VY\ V    #@h.@.@ #@J H..   (  U #U3S	>2 #= #. 8d38n 8 8 
T#s(^ 
 
  #   $ $"!	1S 	1* *# *r*   r   )%
__future__r   r   loggingr6   r9   	functoolsr   typingr   r   r   r	   r
   r   r!   uiautomator2._protor   r   r   uiautomator2.abstractr   uiautomator2.corer   r   r   uiautomator2.exceptionsuiautomator2.settingsr   uiautomator2.utilsr   r   r   	getLoggerr{   r:   r   r~   r*   r)   <module>r      sY    6  	  % : :  E E / U U % * F F			8	$n*( n*r*   