
    %jO                         d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
mZmZmZmZ ddlmZmZ ddlmZ ddlmZ ddlmZ  ej.                  e      Z ej4                  d	      Zd
 Z G d de      Zy)z3Created on Sun Apr 07 2024 18:44:52 by codeskyblue
    N)ListOptionalUnion)
WindowSizeAppInfoRunningAppInfoBatteryInfoBrightnessMode)AdbErrorAdbInstallError)AbstractShellDevice)Sync)retryz.*DisplayViewport{.*?valid=true, .*?orientation=(?P<orientation>\d+), .*?deviceWidth=(?P<width>\d+), deviceHeight=(?P<height>\d+).*c                 0    t        | t              xr | dk  S )N      ?)
isinstancefloatvs    R/var/www/oz-panel.ru/ozpay-pub/venv/lib/python3.12/site-packages/adbutils/shell.py
is_percentr      s    a,AH,    c                   |   e Zd ZdedefdZdeeef   fdZd@defdZd@defdZ	d	 Z
d
 ZdefdZedefd       Zej                   defd       Zedefd       Zej                   defd       ZdefdZdefdZdAdee   defdZdefdZdBdeddfdZdBdeddfdZdAdee   ddfdZdefdZdefd Zdefd!Zd"efd#Z d"efd$Z!d% Z"d&efd'Z#dAd(ee$e      de$e   fd)Z%d*efd+Z&d,d-d.gfd/ed0ed1e'fd2Z(dAd3ed4efd5Z)d3efd6Z*d3efd7Z+d3edee,   fd8Z- e.e/d9d:d;<      de0fd=       Z1defd>Z2de3fd?Z4y)CShellExtensionpropreturnc                 D    | j                  d|g      j                         S )Ngetprop)shellstrip)selfr   s     r   r   zShellExtension.getprop    s    zz9d+,2244r   key_codec                 >    | j                  ddt        |      g       y)z!adb shell input keyevent KEY_CODEinputkeyeventN)r   str)r!   r"   s     r   r%   zShellExtension.keyevent#   s    

GZX78r   timesc                 p    t        |      D ](  }| j                  d       t        j                  d       * y)u   
        Increase the volume by times step
        :param times: times to increase volume，default is 1(Wake up volume bar).
        :return:
        zinput keyevent VOLUME_UP      ?Nranger   timesleepr!   r'   _s      r   	volume_upzShellExtension.volume_up'   s/     u 	AJJ12JJsO	r   c                 p    t        |      D ](  }| j                  d       t        j                  d       * y)u   
        Decrease the volume by times step
        :param times: times to decrease volume，default is 1(Wake up volume bar).
        :return:
        zinput keyevent VOLUME_DOWNr)   Nr*   r.   s      r   volume_downzShellExtension.volume_down1   s/     u 	AJJ34JJsO	r   c                 &    | j                  d       y )Nzinput keyevent VOLUME_MUTEr   r!   s    r   volume_mutezShellExtension.volume_mute;   s    

/0r   c                 &    | j                  d       y )Nrebootr4   r5   s    r   r8   zShellExtension.reboot>   s    

8r   enablec                 4    | j                  |rd      S d      S )zturn screen on/off      )r%   )r!   r9   s     r   switch_screenzShellExtension.switch_screenA   s    }}FS4444r   c                 V    | j                  d      }t        |j                               S )u   
        Return screen brightness value, [0, 255]
        
        Examples:
            print(d.brightness_value) output：128
        z%settings get system screen_brightness)r   intr    r!   values     r   brightness_valuezShellExtension.brightness_valueE   s$     

BC5;;=!!r   rA   c                     t        |t              st        d      d|cxk  rdk  st        d       t        d      | j                  d|        y)zz
        Set screen brightness values
        :param value: brightness value
        eg: d.brightness_value = 128
        z#Brightness value must be an integerr      z*Brightness value must be between 0 and 255z&settings put system screen_brightness N)r   r?   
ValueErrorr   r@   s     r   rB   zShellExtension.brightness_valueP   sX     %%BCCE S IJJ !IJJ

;E7CDr   c                 L    t        | j                  d            }t        |      S )zm
        Return screen brightness mode
        :return: BrightnessMode.AUTO or BrightnessMode.MANUAL
        z*settings get system screen_brightness_mode)r?   r   r
   r@   s     r   brightness_modezShellExtension.brightness_mode]   s#     DJJKLMe$$r   modec                 v    t        |t              r| j                  d|j                          yt	        d      )z
        Set screen brightness mode
        
        Args:
            mode: BrightnessMode.AUTO or BrightnessMode.MANUAL

        Example:
            d.brightness_mode = BrightnessMode.AUTO
        z+settings put system screen_brightness_mode z5Brightness mode must be an instance of BrightnessModeN)r   r
   r   rA   rE   )r!   rH   s     r   rG   zShellExtension.brightness_modef   s2     dN+JJDTZZLQRTUUr   c                     g d}g d}|r|dgz  }|dgz  }n|dgz  }|dgz  }| j                  |       | j                  |       y)zturn airplane-mode on/off)settingsputglobalairplane_mode_on)am	broadcast-az#android.intent.action.AIRPLANE_MODEz--ezstate1true0falseNr4   )r!   r9   base_setting_cmdbase_am_cmds       r   switch_airplanezShellExtension.switch_airplanev   s_    L
 %F8#K%G9$K

#$

;r   c                 <    |rdnd}dd|g}| j                  |       y)zturn WiFi on/offr9   disablesvcwifiNr4   )r!   r9   arglastcmdargss       r   switch_wifizShellExtension.switch_wifi   s#    $()&'*

7r   N	landscapec                     | j                         }|| j                         dz  dk(  }t        j                  d||       |r t	        |j
                  |j                        S |S )aM  
        Return screen (width, height) in pixel, width and height will be swapped if rotation is 90 or 270

        Args:
            landscape: bool, default None, if True, return (width, height), else return (height, width)
            
        Returns:
            WindowSize
        
        Raises:
            AdbError
              z%get window size from 'wm size': %s %s)_wm_sizerotationloggerdebugr   heightwidth)r!   ra   wsizes      r   window_sizezShellExtension.window_size   sW     !+q0I<eYO8Az%,,4LuLr   c                    | j                  d      }t        j                  d|      }|r@|j                  d      |j                  d      }}t	        t        |      t        |            S t        j                  d|      }|r@|j                  d      |j                  d      }}t	        t        |      t        |            S t        d|      )Nzwm sizezOverride size: (\d+)x(\d+)rd   rc   zPhysical size: (\d+)x(\d+)zwm size output unexpected)r   researchgroupr   r?   r   )r!   outputowhms         r   re   zShellExtension._wm_size   s    I&II3V<771:qwwqzqAc!fc!f--II3V<771:qwwqzqAc!fc!f--2F;;r   durationc                    t        t        t        ||||g            r| j                         \  }}t        |      rt	        ||z        n|}t        |      rt	        ||z        n|}t        |      rt	        ||z        n|}t        |      rt	        ||z        n|}t        t
        ||||g      \  }}	}
}| j                  dd||	|
|t        t	        |dz              g       y)z
        swipe from start point to end point

        Args:
            sx, sy: start point(x, y)
            ex, ey: end point(x, y)
        r$   swipe  Nanymapr   rl   r?   r&   r   r!   sxsyexeyrv   rs   rt   x1y1x2y2s               r   rx   zShellExtension.swipe   s     s:BB/01##%DAq *2R!VBB *2R!VBB *2R!VBB *2R!VBBS2r2r"23BB

GWb"b"c#ho:N6OPQr   c                    t        t        t        ||||g            r| j                         \  }}t        |      rt	        ||z        n|}t        |      rt	        ||z        n|}t        |      rt	        ||z        n|}t        |      rt	        ||z        n|}t        t
        ||||g      \  }}	}
}| j                  dd||	|
|t        t	        |dz              g       y)z=
        drag and drop from start point to end point
        r$   draganddropry   Nrz   r}   s               r   dragzShellExtension.drag   s     s:BB/01##%DAq *2R!VBB *2R!VBB *2R!VBB *2R!VBBS2r2r"23BB

G]BBCHtO@T<UVWr   
display_idc                 f   t        t        t        ||g            rI| j                         \  }}t        |      rt	        ||z        n|}t        |      rt	        ||z        n|}t        t
        ||g      \  }}dg}||j                  dt        |      g       | j                  |d||gz          y)z
        simulate android tap

        Args:
            x, y: int
            display_id: int, default None, see "dumpsys SurfaceFlinger --display-id" for valid display IDs
        r$   N-dtap)r{   r|   r   rl   r?   r&   extendr   )r!   xyr   rs   rt   r_   s          r   clickzShellExtension.click   s     s:1v&'##%DAq(mAE
A(mAE
A3A1)!NND#j/23

7eQ]*+r   textc                 *    | j                  dd|g      S )zT
        Type a given text

        Args:
            text: text to be type
        r$   r   r4   )r!   r   s     r   	send_keyszShellExtension.send_keys   s     zz7FD122r   c                    | j                  ddg      }t        j                  d|t        j                        }|r|j	                  d      S | j                  g d      }t        j                  d|      }|r|j	                  d      S | j                  ddg      }t        j                  d|t        j                        }|r|j	                  d      S t        d      )	zget device wlan ip addressifconfigwlan0zinet\s*addr:(.*?)\srd   )ipaddrshowdevr   zinet (\d+.*?)/\d+eth0zfail to parse wlan ip)r   rn   ro   DOTALLrp   r   )r!   resultru   s      r   wlan_ipzShellExtension.wlan_ip   s    Z12II,fbii@771: BCII*F3771: Z01II,fbii@771:.//r   c                     | j                  d      j                         D ]A  }t        j                  d|      }|st	        |j                  d            }t	        |      c S  t        d      )z7
        Returns:
            int [0, 1, 2, 3]
        zdumpsys displayz#.*?orientation=(?P<orientation>\d+)orientationzrotation get failed)r   
splitlinesrn   ro   r?   rp   r   )r!   lineru   rr   s       r   rf   zShellExtension.rotation   sg    
 JJ01<<> 	D		@$GAAGGM*+Aq6M	 ,--r   pathc                 *    | j                  d|g       y)zrm device filermNr4   r!   r   s     r   removezShellExtension.remove  s    

D$< r   c                 ,    | j                  dd|g       y)zrm -r directoryr   -rNr4   r   s     r   rmtreezShellExtension.rmtree  s    

D$%&r   c                 0    | j                  ddg      }d|v S )Ndumpsyspowerz"mHoldingDisplaySuspendBlocker=truer4   )r!   rq   s     r   is_screen_onzShellExtension.is_screen_on  s     Y013v==r   urlc                 h    t        j                  d|      sd|z   }| j                  ddddd|g       y )Nz
^https?://zhttps://rO   startrQ   zandroid.intent.action.VIEWr   )rn   matchr   )r!   r   s     r   open_browserzShellExtension.open_browser  s4    xxc*s"C

D'4)EtSQRr   filter_listc                    g }g d}|r|j                  |       | j                  |      }t        j                  d|t        j                        D ]"  }|j                  |j                  d             $ t        t        |            S )a6  
        Args:
            filter_list (List[str]): package filter
                -f: See associated file.
                -d: Filter to only show disabled packages.
                -e: Filter to only show enabled packages.
                -s: Filter to only show system packages.
                -3: Filter to only show third-party packages.
                -i: See the installer for the packages.
                -u: Include uninstalled packages.
                --user user_id: The user space to query.
        Returns:
            list of package names
        )pmlistpackagesz^package:([^\s]+)\r?$rd   )	r   r   rn   finditerMappendrp   r   sorted)r!   r   r   cmdrq   ru   s         r   list_packageszShellExtension.list_packages  sn     (JJ{#C5vrttD 	&AMM!''!*%	&F6N##r   pkg_namec                 *    | j                  dd|g      S )zg
        Uninstall app by package name

        Args:
            pkg_name (str): package name
        r   	uninstallr4   )r!   r   s     r   r   zShellExtension.uninstall4  s     zz4h788r   Fr   z-tremote_pathcleanflagsc                     ddg|z   |gz   }| j                  |      }d|vrt        |      |r| j                  d|g       yy)z
        Args:
            remote_path: remote package path
            clean(bool): remove when installed, default(False)
            flags (list): default ["-r", "-t"]

        Raises:
            AdbInstallError
        r   installSuccessr   N)r   r   )r!   r   r   r   argsrq   s         r   install_remotezShellExtension.install_remote=  sT     i 5(K=8D!F"!&))JJk*+ r   package_nameactivityc                 n    |r| j                  ddd|dz   |z   g       y
| j                  dd|ddd	g       y
)z&start app with "am start" or "monkey" rO   r   z-n/monkeyz-pz-cz android.intent.category.LAUNCHERrS   Nr4   )r!   r   r   s      r   	app_startzShellExtension.app_startP  sG    JJgt\C-?(-JKLJJ 6	r   c                 ,    | j                  dd|g       y)zstop app with "am force-stop" rO   z
force-stopNr4   r!   r   s     r   app_stopzShellExtension.app_stop`  s    

D,56r   c                 ,    | j                  dd|g       y )Nr   clearr4   r   s     r   	app_clearzShellExtension.app_cleard  s    

D'<01r   c                    | j                  dd|g      }d|vry|j                         }|d   j                  dd      d   j                         }t	        t        d	 |dd             }| j                  d
d|g      }t        j                  d      j                  |      }|r|j                  d      nd}|dk(  rd}t        j                  d      j                  |      }|r|j                  d      nd}|j                         rt        |      nd}t        j                  d|      }|r|j                  d      nd}	|s|	yt        j                  d      j                  |      }|r|j                  d      nd}
|
j                         }
d}t        j                  d| d      j                  |      }|r/t        j                  j                  |j                  d      d      nd}t        j                  d| d      j                  |      }|r=t        j                  j                  |j                  d      j                         d      nd}t        ||||
|||	||	      }|S )zL
        Get app info

        Returns:
            None or AppInfo
        r   r   package:Nr   :rd   c                 (    | j                  ddd      S )Nr    rd   )replace)ps    r   <lambda>z)ShellExtension.app_info.<locals>.<lambda>t  s    199ZQ+G r   r   packagezversionName=(?P<name>[^\s]+)namer   nullzversionCode=(?P<code>\d+)codez PackageSignatures\{.*?\[(.*)\]\}zpkgFlags=\[\s*(.*)\s*\]z[-\d]+\s+[:\d]+zfirstInstallTime=()z%Y-%m-%d %H:%M:%SzlastUpdateTime=()	r   version_nameversion_coder   first_install_timelast_update_time	signaturer   sub_apk_paths)r   r   splitr    r   r|   rn   compilero   rp   isdigitr?   datetimestrptimer   )r!   r   rq   	apk_pathsapk_pathr   ru   r   r   r   pkgflags
time_regexr   r   app_infos                  r   r   zShellExtension.app_infog  s>    T6<89V#%%'	Q<%%c1-b1779S!GSTSUWXY	<@AJJ67>>vF*+qwwv6!LJJ34;;FC*+qwwv,8,@,@,Bs<(II96B"#AGGAJ		 1JJ1299&A!"1771:>>#'
JJ+J<q9:AA&IKLH&&qwwqz3FGRV 	 JJ)*Q78??G  &&qwwqz'7'7'9;NO 	 %%%1-'

 r   r)      g?)delaytriesjitterc           
         t        j                  d      }|j                  | j                  g d            }|r+t	        |j                  d      |j                  d            S d}| j                  g d      }t        j                  d      }|j                  |      }|r|j                  d      }t        j                  d	      }| j                  g d
      }|j                  |      }d}|D ]Y  }t	        |j                  d      |j                  d      t        |j                  d                  }|j                  |k(  sW|c S  |r|S t        d      )z
        Returns:
            RunningAppInfo(package, activity, pid?)  pid can be 0

        Raises:
            AdbError
        zDmCurrentFocus=Window{.*\s+(?P<package>[^\s]+)/(?P<activity>[^\s]+)\})r   windowwindowsr   r   )r   r   N)r   r   
activitieszWmResumedActivity: ActivityRecord\{.*?\s+(?P<package>[^\s]+)/(?P<activity>[^\s]+)\s.*?\}zGACTIVITY (?P<package>[^\s]+)/(?P<activity>[^/\s]+) \w+ pid=(?P<pid>\d+))r   r   toppid)r   r   r   zCouldn't get focused app)
rn   r   ro   r   r   rp   r   r?   r   r   )	r!   
_focusedREru   r   rq   	_recordRE_activityREmsrets	            r   app_currentzShellExtension.app_current  sE   " ZZS

 djj)IJK!	*QWWZ5H  ABJJf
	 V$ggi(G jjV
 :;!!&) 	A 	*,'C
 {{g%
	 J122r   c                    d}| j                  d| d| d      }d|v sd|vrt        d|      d}| j                  j                  |      D ]  }||z  }	 |j	                  d	      }|j                  d
      st        d|      |S )z}
        uiautomator dump

        Returns:
            content of xml
        
        Raises:
            AdbError
        z/data/local/tmp/uidump.xmlzrm -f z; uiautomator dump z && echo successERRORsuccesszuiautomator dump failedr   zutf-8z<?xmlzdump output is not xml)r   r   synciter_contentdecode
startswith)r!   targetrq   bufchunkxml_datas         r   dump_hierarchyzShellExtension.dump_hierarchy  s     .VH/x7GHJf	 74f==YY++F3 	E5LC	::g&""7+3X>>r   c                    dt         dt        fd}| j                  ddg      }i |j                         D ]K  }d|vr|j	                         j                  dd      \  }}|j	                         |j	                         <   M dt         ffd	} |d
|      } |d|      } |d|      }	 |d|      }
 |dt              } |dt              } |dt              } |dt              } |dt              } |d|      } |dt              } |dt              } |dt              } |dd       }j                  dt               }t        |||	|
|||||||||||      S )u  
        Get battery info

        Returns:
            BatteryInfo

        Details:
            AC powered - Indicates that the device is currently not powered by AC power. If true, it indicates that the device is connected to an AC power adapter.
            USB powered - Indicates that the device is currently being powered or charged through the USB interface.
            Wireless powered - Indicates that the device is not powered through wireless charging. If wireless charging is supported and currently in use, this will be true.
            Max charging current - The maximum charging current supported by the device, usually in microamperes（ μ A).
            Max charging voltage - The maximum charging voltage supported by the device may be in millivolts (mV).
            Charge counter - The cumulative charge count of a battery, usually measured in milliampere hours (mAh)
            Status - Battery status code.
            Health - Battery health status code.
            Present  - indicates that the battery is currently detected and installed in the device.
            Level - The percentage of current battery level.
            Scale - The full scale of the percentage of battery charge, indicating that the battery level is measured using 100 as the standard for full charge.
            Voltage - The current voltage of the battery, usually measured in millivolts (mV).
            Temperature - Battery temperature, usually measured in degrees Celsius (° C)
            Technology - Battery type, like (Li-ion) battery
        r   r   c                     | dk(  S )NrT    r   s    r   to_boolz'ShellExtension.battery.<locals>.to_bool	  s    ;r   r   batteryr   rd   kc                 <    j                  |       }| ||      S y N)get)r  map_functionr   	shell_kvss      r   get_keyz'ShellExtension.battery.<locals>.get_key  s#    a A}#A&r   z
AC poweredzUSB poweredzWireless poweredzDock poweredzMax charging currentzMax charging voltagezCharge counterstatushealthpresentlevelscalevoltagetemperaturec                     t        |       dz  S )N
   )r?   )r   s    r   r   z(ShellExtension.battery.<locals>.<lambda>'  s    s1v{ r   
technology)
ac_poweredusb_poweredwireless_powereddock_poweredmax_charging_currentmax_charging_voltagecharge_counterr  r  r  r  r   r!  r"  r%  )	r&   boolr   r   r    r   r?   r  r	   )r!   r  rq   r   keyvalr  r&  r'  r(  r)  r*  r+  r,  r  r  r  r  r   r!  r"  r%  r  s                         @r   r  zShellExtension.battery  s   0	s 	t 	 Y	23	%%' 	1D$zz|))#q1HC%(YY[Iciik"		1	s 	 \73
mW5"#5w?~w7&'=sC&'=sC !1373'3')W-%%)S)m-BC]]<5
!#-%!5!5)#!
 	
r   )rd   r  )r   )5__name__
__module____qualname__r&   r   r   r?   r%   r0   r2   r6   r8   r-  r=   propertyrB   setterr
   rG   rY   r`   r   r   rl   re   r   rx   r   r   r   r   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	   r  r  r   r   r   r      s~   5C 5C 59sCx 9s  15D 5 "# " " 
Ec 
E 
E % % % VN V V d  *$ MXd^ Mz M&
<* 
<Re Rd R"XU XT X,hsm ,t ,$3c 30 0*.# .!3 !'3 '>S S
$$s))< $S	 $09# 9 38d|,",+/,@D,&c S  7S 72c 27S 7Xg-> 7r 83a463^ 63 563p 0H
 H
r   r   )__doc__r   loggingrn   r,   typingr   r   r   adbutils._protor   r   r   r	   r
   adbutils.errorsr   r   adbutils._interfacesr   adbutils.syncr   r   	getLoggerr0  rg   r   _DISPLAY_REr   r   r  r   r   <module>r>     sl      	  ( ( \ \ 5 4  			8	$bjj K
-
Z
( Z
r   