U
    |’“eøè  ã                   @   sd  d Z ddlZejdkredƒ‚ddlmZ deƒ d  ¡ kZdZd	Zd
Z	d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mZ ddlmZmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZ ddlmZ ddlm Z m!Z!m"Z" ddl#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Z,dZ-ddgZ.dj/e
dZ0G dd„ deƒZ1dd „ Z2dS )!z5
Android target, based on python-for-android project
é    NÚwin32z,Windows platform not yet working for Android)ÚunameZ	microsofté   Z31Z21z1.9.4Z17c)ÚplatformÚ
executable)ÚBuildozerExceptionÚ	USE_COLOR)ÚTarget)Úenviron)ÚexistsÚjoinÚrealpathÚ
expanduserÚbasenameÚrelpath)Úarchitecture)ÚcopyfileÚrmtreeÚwhich)Úglob)Úsleep)Úparse)ÚLooseVersion))Úappzandroid.sdkZ6514223ú	arm64-v8aúarmeabi-v7azWARNING: Unable to find recommended Android NDK for current installation of python-for-android, defaulting to the default version r{android_ndk})Zandroid_ndkc                       sæ  e Zd ZdZdZdZdZdZdZdZ	‡ fdd	„Z
d
d„ Zdd„ Zedd„ ƒZedd„ ƒZdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed d!„ ƒZed"d#„ ƒZd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Z d4d5„ Z!d6d7„ Z"d8d9„ Z#d:d;„ Z$d<d=„ Z%d>d?„ Z&d@dA„ Z'dBdC„ Z(dDdE„ Z)dFdG„ Z*dHdI„ Z+dJdK„ Z,dLdM„ Z-didOdP„Z.‡ fdQdR„Z/dSdT„ Z0dUdV„ Z1dWdX„ Z2dYdZ„ Z3d[d\„ Z4d]d^„ Z5ed_d`„ ƒZ6dadb„ Z7‡ fdcdd„Z8dedf„ Z9dgdh„ Z:‡  Z;S )jÚTargetAndroidÚandroidzpython-for-androidZkivyZmasterÚHEADNÚ c                    s  t ƒ j||Ž | jj dd¡rh| jj dd¡sh| j d¡ | j d¡ | j d¡ | jj ddt¡| _n| jj ddt¡| _t	| jj
d | j¡ƒ| _tjpœd}|d	d
g| _| jj ddd¡| _trÆdnd}d|› d| j› g| _| jj dd| j¡}| j d|› ¡ | jj ddd ¡}|d k	r>| j dtt|ƒƒ› ¡ | jj ddd ¡}|d k	rl| j d|› ¡ | jj ddd¡}|r’| j d¡ n| j d¡ | jj ddd¡}	|	dkrÌ| j d|	› ¡ | jjdkræ| j d¡ | jj dd d!¡}
| j t |
¡¡ |  ¡  d S )"Nr   zandroid.archzandroid.archsz@`android.archs` not detected, instead `android.arch` is present.z5`android.arch` will be removed and ignored in future.z?If you're seeing this error, please migrate to `android.archs`.zbuild-{}Úpythonú-mzpythonforandroid.toolchainúp4a.bootstrapÚsdl2ÚalwaysÚneverz--color=z--storage-dir=zandroid.ndk_apiz
--ndk-api=zp4a.hookz--hook=zp4a.portz--port=zp4a.setup_pyFz--use-setup-pyz--ignore-setup-pyúandroid.activity_class_nameúorg.kivy.android.PythonActivityz--activity-class-name=r   z--debugzp4a.extra_argsr   )ÚsuperÚ__init__Ú	buildozerÚconfigÚ
has_optionÚerrorÚgetlistÚDEFAULT_ARCHSÚ_archsr   Úplatform_dirÚformatÚarchs_snakeÚ
_build_dirÚsysr   Ú_p4a_cmdÚ
getdefaultÚ_p4a_bootstrapr   Úextra_p4a_argsÚandroid_minapiÚappendr   r   Z	log_levelÚextendÚshlexÚsplitÚwarn_on_deprecated_tokens)ÚselfÚargsÚkwargsr   ÚcolorZndk_apiÚhookÚportÚsetup_pyÚactivity_class_nameZuser_extra_p4a_args©Ú	__class__© ú=/tmp/pip-unpacked-wheel-ohd2lbr1/buildozer/targets/android.pyr)   E   sz     ÿþ  ÿ  ÿ 
ÿ
  ÿ  ÿ

  ÿ
zTargetAndroid.__init__c                 C   sF   t D ]<\}}| jj ||d ¡}|d k	rd |||¡}| j |¡ qd S )NzKWARNING: Config token {} {} is deprecated and ignored, but you set value {})ÚDEPRECATED_TOKENSr*   r+   r7   r2   r-   )r@   ÚsectionÚtokenÚvaluer-   rJ   rJ   rK   r?   {   s      ÿz'TargetAndroid.warn_on_deprecated_tokensc                 K   s(   |  d| j¡ | jj| j|| j•f|ŽS )NÚcwd)Ú
setdefaultÚp4a_dirr*   Úcmdr6   r9   )r@   rS   rB   rJ   rJ   rK   Ú_p4aƒ   s    zTargetAndroid._p4ac                 C   s0   t | jj| jƒ}| jj dd¡}|r,t|ƒ}|S )z<The directory where python-for-android is/will be installed.r   úp4a.source_dir)r   r*   r1   Úp4a_directory_namer+   r7   r   )r@   rR   Úsystem_p4a_dirrJ   rJ   rK   rR   ‡   s
    zTargetAndroid.p4a_dirc                 C   sš   | j dk	r| j S t}t| jddƒ}tj |¡s>| j t	¡ |S t
|dƒD ]L}| d¡rH| dd¡}dD ]}| |d¡}qf| j d |¡¡ || _  q–qH|S )	a!  
        Return the p4a's recommended android's NDK version, depending on the
        p4a version used for our buildozer build. In case that we don't find
        it, we will return the buildozer's recommended one, defined by global
        variable `DEFAULT_ANDROID_NDK_VERSION`.
        NZpythonforandroidzrecommendations.pyÚrzRECOMMENDED_NDK_VERSION =r   >   ú'ú"Ú
ú z/Recommended android's NDK version by p4a is: {})Úp4a_recommended_ndk_versionÚDEFAULT_ANDROID_NDK_VERSIONr   rR   ÚosÚpathÚisfiler*   r-   ÚMSG_P4A_RECOMMENDED_NDK_ERRORÚopenÚ
startswithÚreplaceÚinfor2   )r@   Zndk_versionZrec_fileÚlineÚirJ   rJ   rK   Úp4a_recommended_android_ndk•   s.    	

 ÿÿÿz)TargetAndroid.p4a_recommended_android_ndkc                 O   sj   | j }| d|¡|d< | jd|› f|•}| dd¡rF| jj|f|ŽS | dd¡|d< | jj|f|ŽS dS )z@Call the sdkmanager in our Android SDK with the given arguments.rP   z--sdk_root=Úreturn_childFÚ
get_stdoutTN)Úandroid_sdk_dirÚgetÚsdkmanager_pathÚpopr*   Z
cmd_expectrS   )r@   rA   rB   rl   ÚcommandrJ   rJ   rK   Ú_sdkmanager¹   s    zTargetAndroid._sdkmanagerc                 C   s   | j j dd| j¡S )Nr   úandroid.ndk)r*   r+   r7   ri   ©r@   rJ   rJ   rK   Úandroid_ndk_versionÆ   s    ÿz!TargetAndroid.android_ndk_versionc                 C   s   | j j ddt¡S )Nr   zandroid.api)r*   r+   r7   ÚANDROID_APIrs   rJ   rJ   rK   Úandroid_apiË   s    ÿzTargetAndroid.android_apic                 C   s   | j j ddt¡S )Nr   úandroid.minapi)r*   r+   r7   ÚANDROID_MINAPIrs   rJ   rJ   rK   r:   Ð   s    ÿzTargetAndroid.android_minapic                 C   s0   t | jj ddd¡ƒ}|r"t|ƒS t| jjdƒS )Nr   zandroid.sdk_pathr   zandroid-sdk)r   r*   r+   r7   r   r   Úglobal_platform_dir)r@   Ú	directoryrJ   rJ   rK   rl   Õ   s    
  ÿÿzTargetAndroid.android_sdk_dirc                 C   sJ   t | jj ddd¡ƒ}|r"t|ƒS | jj dd| j¡}t| jjd |¡ƒS )Nr   zandroid.ndk_pathr   rr   úandroid-ndk-r{0})	r   r*   r+   r7   r   rt   r   ry   r2   ©r@   rz   ÚversionrJ   rJ   rK   Úandroid_ndk_dirÞ   s    
  ÿÿÿzTargetAndroid.android_ndk_dirc                 C   sH   t | jj ddd¡ƒ}|r"t|ƒS | jj ddt¡}t| jjd |¡ƒS )Nr   zandroid.ant_pathr   zandroid.antzapache-ant-{0})	r   r*   r+   r7   r   ÚAPACHE_ANT_VERSIONr   ry   r2   r|   rJ   rJ   rK   Úapache_ant_diré   s    
  ÿÿÿzTargetAndroid.apache_ant_dirc                 C   s.   t | jdddƒ}tj |¡s*td |¡ƒ‚|S )NZtoolsÚbinZ
sdkmanagerz?sdkmanager path "{}" does not exist, sdkmanager is notinstalled)r   rl   r_   r`   ra   r   r2   )r@   rn   rJ   rJ   rK   rn   ô   s       ÿÿÿzTargetAndroid.sdkmanager_pathc                 C   s   d  | j¡S )NÚ_)r   r0   rs   rJ   rJ   rK   r3   þ   s    zTargetAndroid.archs_snakec                 C   s\  t dkrTz|  ¡  W n   t ¡  Y nX t| jddƒ| _|  d¡| _|  d¡| _	n`t| jddƒ| _|  d¡| _|  d¡| _	t
d	ƒd k	}|r | j d
¡s tdƒ‚t  d¡r´dtjd< | jj ddd¡}t |¡| _t| jdƒg}d| jjkr| | jjd ¡ n| tjd ¡ d |¡| jjd< | jj}|ddƒ |ddƒ |d| jƒ |d| j	ƒ d S )N©r   Úcygwinúplatform-toolszadb.exez	javac.exezkeytool.exeZadbZjavacZkeytoolZdpkgz/usr/include/zlib.hzDzlib headers must be installed, run: sudo apt-get install zlib1g-devÚfreebsdÚlinuxZREPO_OS_OVERRIDEr   zandroid.adb_argsr   r   ÚPATHú:z	Git (git)ÚgitzCython (cython)ZcythonzJava compiler (javac)zJava keytool (keytool))r   Ú_set_win32_java_homeÚ	tracebackÚ	print_excr   rl   Úadb_executableÚ_locate_javaZ	javac_cmdZkeytool_cmdr   r*   Úfile_existsr   rd   r_   r
   r+   r7   r=   r>   Úadb_argsr€   r;   Úcheckbin)r@   Zis_debian_liker‘   r`   r’   rJ   rJ   rK   Úcheck_requirements  sL    ÿ
ÿÿ

  ÿ

z TargetAndroid.check_requirementsc                 C   s*   | j ddgddd }|dkr"dS dS d S )NÚaabz-hF)Úbreak_on_errorr   r   T©rT   )r@   Ú
returncoderJ   rJ   rK   Ú_p4a_have_aab_support2  s    z#TargetAndroid._p4a_have_aab_supportc              
   C   sz   d| j jkrd S dd l}| |jd¡J}| |d¡\}}| ||¡}| |d¡\}}W 5 Q R X || j jd< W 5 Q R X d S )NÚ	JAVA_HOMEr   z&SOFTWARE\JavaSoft\Java Development KitZCurrentVersionZJavaHome)r*   r
   Ú_winregÚOpenKeyÚHKEY_LOCAL_MACHINEÚQueryValueEx)r@   rš   ZjdkÚcurrent_versionÚ_typeZcvZ	java_homerJ   rJ   rK   r‹   9  s$    þ ÿ ÿz"TargetAndroid._set_win32_java_homec                 C   s(   d| j jkr t| j jd d|ƒS |S dS )z^If JAVA_HOME is in the environ, return $JAVA_HOME/bin/s. Otherwise,
        return s.
        r™   r   N)r*   r
   r   )r@   ÚsrJ   rJ   rK   r   G  s    zTargetAndroid._locate_javac                 C   sŠ   | j }| j |¡r(| j d |¡¡ |S tj |¡s>t |¡ | j d¡ d t	¡}d}| jj
|||d | jj||d | j d¡ |S )NzApache ANT found at {0}z#Android ANT is missing, downloadingzapache-ant-{0}-bin.tar.gzz-https://archive.apache.org/dist/ant/binaries/©rP   zApache ANT installation done.)r€   r*   r   rf   r2   r_   r`   r   Úmakedirsr   ÚdownloadÚfile_extract)r@   Zant_dirÚarchiveÚurlrJ   rJ   rK   Ú_install_apache_antP  s$    

þÿz!TargetAndroid._install_apache_antc                 C   sâ   | j }| j |¡r(| j d |¡¡ |S | j d¡ tdkrHd t¡}nBtdkr\d t¡}n.t d¡spt d¡r|d	 t¡}ntd
 t¡ƒ‚t	j
 |¡s t	 |¡ d}| jj|||d | j d¡ | jj||d | j d¡ |S )NzAndroid SDK found at {0}z#Android SDK is missing, downloadingrƒ   z"commandlinetools-win-{}_latest.zip)Údarwinz"commandlinetools-mac-{}_latest.zipr‡   r†   z$commandlinetools-linux-{}_latest.zipzUnsupported platform: {0}ú)https://dl.google.com/android/repository/r¡   zUnpacking Android SDKz)Android SDK tools base installation done.)rl   r*   r   rf   r2   r   ÚDEFAULT_SDK_TAGrd   ÚSystemErrorr_   r`   r   r¢   r£   r¤   )r@   Zsdk_dirr¥   r¦   rJ   rJ   rK   Ú_install_android_sdkd  s2    
þÿz"TargetAndroid._install_android_sdkc                 C   sº  | j }| j |¡r(| j d |¡¡ |S dd l}t| d| j¡ 	d¡ƒ}| j d¡ t
dk}t
 d¡}t
 d¡}t
d	kr˜dd l}d
}d| d¡ dk}	nn|s¤|s¤|rø|s¬|r°dnd}
| jdkrÄd}n|dkrÒd}nd}d|
 d | }dt ¡ d k}	ntd t
¡ƒ‚|	rdnd}|dkr"dnd|› }d}| | j|¡}| | j¡}|dkrZd}nd }| jj||| jjd! | j d"¡ | jj|| jjd! | jj||| jjd! | j d#¡ |S )$NzAndroid NDK found at {0}r   z(\d+)é   z#Android NDK is missing, downloadingr¨   r‡   r†   rƒ   z android-ndk-r{0}-windows-{1}.zipé   ÚPé@   )Z10cZ10dZ10er   é
   ztar.bz2Úzipzandroid-ndk-r{0}-z{1}.Z64é   zUnsupported platform: {}Úx86_64Úx86é   r   ú-r{   é   r©   z"https://dl.google.com/android/ndk/r¡   zUnpacking Android NDKzAndroid NDK installation done.)r~   r*   r   rf   r2   ÚreÚintÚsearchrt   Úgroupr   rd   ÚstructÚcalcsizer_   r   r«   r£   ry   r¤   Zfile_rename)r@   Zndk_dirr¹   Ú_versionZ	is_darwinZis_linuxZ
is_freebsdr½   r¥   Zis_64Ú	_platformÚextr   Úunpackedr¦   rJ   rJ   rK   Ú_install_android_ndk„  s\    



þÿþz"TargetAndroid._install_android_ndkc                 C   s„   |   d¡}|d  d¡}g }|D ]^}| ¡  d¡s4q | ¡  d¡d }| d¡dksbtd |¡ƒ‚| d¡d }| t|ƒ¡ q |S )	Nz--listr   r[   úbuild-tools;r\   ú;r­   zcould not parse package "{}")	rq   r>   Ústriprd   ÚcountÚAssertionErrorr2   r;   r   )r@   Zavailable_packagesÚlinesÚbuild_tools_versionsrg   Úpackage_namer}   rJ   rJ   rK   Ú"_android_list_build_tools_versionsÃ  s    
ÿz0TargetAndroid._android_list_build_tools_versionsc                 G   st   | j j ddd¡}i }|r$d|d< nd|d< | j||Ž}|rp| ¡ rp|jdtjtjgdd	}|d
kr<| 	d¡ q<dS )z.Update the tools and package-tools if possibler   zandroid.accept_sdk_licenseFTrj   Úshow_outputz(y/N)i,  )Útimeoutr   ÚyN)
r*   r+   Úgetbooldefaultrq   ZisaliveÚexpectÚpexpectÚEOFÚTIMEOUTZsendline)r@   Zsdkmanager_commandsZauto_accept_licenserB   Z	ret_childZ
pexp_matchrJ   rJ   rK   Ú_android_update_sdkÖ  s$      ÿ
 ÿz!TargetAndroid._android_update_sdkc                 G   s   g }t j t|Ž ¡s2| j d t|Ž ¡¡ tdƒS t  t|Ž ¡D ]$}z| 	t|ƒ¡ W q@   Y q@X q@|sˆ| j 
d t|Ž ¡¡ tdƒS t|ƒS )Nzbuild-tools folder not found {}Ú0z(Unable to find the latest version for {})r_   r`   r   r   r*   Údebugr2   r   Úlistdirr;   r-   Úmax)r@   rA   ÚversionsÚvrJ   rJ   rK   Ú_read_version_subdirë  s"    ÿÿz"TargetAndroid._read_version_subdirc                 C   sJ   g }|D ]0}|  |¡sq| |¡d }t|ƒ}| |¡ q|sBd S t|ƒS )Néÿÿÿÿ)rd   r>   r   r;   rÙ   )r@   ÚpackagesÚkeyZpackage_versionsÚpÚversion_stringr}   rJ   rJ   rK   Ú_find_latest_packageü  s    
z"TargetAndroid._find_latest_packagec                 C   s†  d}| j | j| j| j| jg}| jj |d ¡|kr4dS | jj 	ddd¡}|sl| j 
d¡ |  d¡ |  d¡ n| j 
d	¡ | j 
d
¡ | j 
d¡ |  | jd¡}|  ¡ }|s¶| j d¡ t|ƒd }||krö|sä|  d|› ¡ |}n| j 
d |¡¡ |  |¡ | j 
d¡ t| jdd | j ¡ƒ}| j |¡s^|sJ|  d| j › ¡ n| j 
d | j ¡¡ | j 
d¡ || jj|< | jj ¡  d S )Nzandroid:sdk_installationTr   zandroid.skip_updateFz3Installing/updating SDK platform tools if necessaryr…   z--updatez4Skipping Android SDK update due to spec file settingz:Note: this also prevents installing missing SDK componentsz%Updating SDK build tools if necessaryúbuild-toolsz2Did not find any build tools available to downloadrÝ   rÄ   z5Skipping update to build tools {} due to spec settingz,Downloading platform api target if necessaryÚ	platformsz
android-{}zplatforms;android-z:Skipping install API {} platform tools due to spec settingz#Android packages installation done.)rv   r:   rt   rl   r~   r*   Ústaterm   r+   rÐ   rf   rÕ   rÜ   rÌ   r-   Úsortedr2   Ú_check_aidlr   r   rq   Úsync)r@   Ú	cache_keyZcache_valueZskip_updZinstalled_v_build_toolsZavailable_v_build_toolsZlatest_v_build_toolsZandroid_platformrJ   rJ   rK   Ú_install_android_packages  sf       þ  ÿ
ÿÿÿ
ÿÿz'TargetAndroid._install_android_packagesc                 C   sÖ   | j  d¡ |  | jd¡}t| jdt|ƒdƒ}| j  d|¡ | j j|ddd\}}}|dkrÒ| j  d¡ t	ƒ d	 d
kr¨| j  d¡ | j  d¡ | j  d¡ | j  d¡ n$| j  d¡ | j  d¡ | j  d¡ t
ƒ ‚d S )NzCheck that aidl can be executedrã   ZaidlZAidlF)r•   rÍ   r­   zAidl cannot be executedr   Ú64bitr   z,You might have missed to install 32bits libszCCheck https://buildozer.readthedocs.org/en/latest/installation.htmlzAIn case of a bug report, please add a full log with log_level = 2)r*   r×   rÜ   rl   r   Ústrr’   rS   r-   r   r   )r@   Zv_build_toolsZaidl_cmdr‚   r—   rJ   rJ   rK   rç   I  s<    ÿ ÿþÿÿÿzTargetAndroid._check_aidlc                 C   st   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡ sJ| j d¡ t	ƒ ‚| jj
 | jj| j| j| j| jdœ¡ d S )Nz’This buildozer version requires a python-for-android version with AAB (Android App Bundle) support. Please update your pinned version accordingly.)ZPACKAGES_PATHZ
ANDROIDSDKZ
ANDROIDNDKZ
ANDROIDAPIZANDROIDMINAPI)Ú_install_p4ar§   r¬   rÃ   rê   Zcheck_configuration_tokensr˜   r*   r-   r   r
   ÚupdateZglobal_packages_dirrl   r~   rv   r:   rs   rJ   rJ   rK   Úinstall_platformc  s$    ÿûzTargetAndroid.install_platformc              
   C   sÀ  | j j}| j j dd| j¡}| j j ddd|› d¡}| j j dd| j¡}| j j dd| j¡}| j}| j j dd¡}|r¦| j  |¡s¢| j  	d	¡ | j  	d
¡ t
ƒ ‚nT| j  |¡r*|ddddgd|dd  ¡ }|dddgd|dd  ¡ d }	t||k|	|kgƒr*| j  d|› d|	› d¡ t|ƒ | j  |¡sZ|ddd|d|| jg| j jd n‚| jrÜ|dddg|d |dddd gd|dd  ¡ }
|
|kr®|dd!g|d n.|dd"d#d$d% |¡g|d |dd&|g|d |d krú|dd'd(|g|d zLtt| jd)ƒƒ2}| ¡ }t d*|tjtjB ¡d }t |¡}W 5 Q R X W n: tk
r€   | j  	d+ t| jd)ƒ¡¡ t d¡ Y nX d,g}d-t j!ks d.t j!kr¤g }|t"d/d0d1d2f||•ƒ d S )3Nr   zp4a.forkzp4a.urlzhttps://github.com/z/python-for-android.gitz
p4a.branchz
p4a.commitrU   z&Path for p4a.source_dir does not existr   rŠ   r+   z--getzremote.origin.urlT)rk   rP   r   Úbranchz-vvr­   zDetected old url/branch (ú/z), deleting...Úclonez-bz--single-branchr¡   Úcleanz-dxfz	rev-parsez--abbrev-refr   ÚpullÚfetchz--tagsÚoriginz{0}:{0}ÚcheckoutÚresetz--hardzsetup.pyz^\s*install_reqs = (\[[^\]]*\])z0Failed to read python-for-android setup.py at {}z--userÚVIRTUAL_ENVZCONDA_PREFIXr!   ÚpipÚinstallz-q)#r*   rS   r+   r7   Úp4a_forkÚ
p4a_branchÚ
p4a_commitrR   r   r-   r   rÆ   r>   Úanyrf   r   rV   r1   Zplatform_updater2   rc   r   Úreadr¹   ÚfindallÚDOTALLÚ	MULTILINEÚastÚliteral_evalÚIOErrorr5   Úexitr_   r
   r   )r@   rS   rü   Zp4a_urlrý   rþ   rR   rW   Zcur_urlZ
cur_branchZcurrent_branchÚfdÚsetupÚdepsÚoptionsrJ   rJ   rK   rí   |  sÀ      ÿ  
ÿ  ÿ  ÿ
ÿÿ

ýü  ÿþþÿù	ö ÿÿ
ÿ


ÿzTargetAndroid._install_p4ac           	   	   C   s  | j j ddd¡}| j j dd¡}|  ¡ }d |¡}g }dd„ | j j d¡D ƒ}|rˆ| j j |¡ | j  	d 
d	 d
d„ | ¡ D ƒ¡¡¡ | j j ddd¡r¤| d¡ |r¼| d¡ | |¡ dd|› d| j› d|› g}| jD ]}| d|› ¡ qâ| |¡ | j|ddd  d S )Nr   Úrequirementsr   úpackage.nameú,c                 S   s6   i | ].\}}|  d ¡rd |dd… ¡tt|ƒƒ“qS )zrequirements.source.z
P4A_{}_DIRé   N)rd   r2   r   r   )Ú.0ÚnamerO   rJ   rJ   rK   Ú
<dictcomp>Ú  s   
þ z2TargetAndroid.compile_platform.<locals>.<dictcomp>z Using custom source dirs:
    {}z
    c                 S   s   g | ]\}}d   ||¡‘qS )z{} = {})r2   )r  ÚkrÛ   rJ   rJ   rK   Ú
<listcomp>â  s   ÿz2TargetAndroid.compile_platform.<locals>.<listcomp>úandroid.copy_libsTú--copy-libsú--local-recipesÚcreatez--dist_name=z--bootstrap=z--requirements=z--arch=©rk   r   )r*   r+   r.   rm   Úget_local_recipes_dirr   Úitemsr
   rî   rf   r2   rÐ   r;   r8   r0   r<   rT   )	r@   Zapp_requirementsÚ	dist_nameÚlocal_recipesr  r  Zsource_dirsZ
p4a_createÚarchrJ   rJ   rK   Úcompile_platformÒ  s:      ÿ
þ

ÿÿ


 

zTargetAndroid.compile_platformc                 C   s   dS )NTrJ   rs   rJ   rJ   rK   Úget_available_packagesõ  s    z$TargetAndroid.get_available_packagesc                 C   s   t | jd|ƒ}t|ƒr|S |S )zsFind the dist dir with the given name if one
        already exists, otherwise return a new dist_dir name.
        Údists)r   r4   r   )r@   r  Zexpected_dist_dirrJ   rJ   rK   Úget_dist_dirø  s    zTargetAndroid.get_dist_dirc                 C   s$   | j j dd¡}|r tt|ƒƒS d S )Nr   zp4a.local_recipes)r*   r+   r7   r   r   )r@   r  rJ   rJ   rK   r    s    z#TargetAndroid.get_local_recipes_dirc           %      C   s´  | j j dd¡}|  ¡ }| jd| jd|g}|D ]Š}|d |dd …  }}|dkrTq.n(|dkr|| d	¡ |  d
¡r.| d¡ q.|dkr| d¡ q.|dkr®| d¡ | |¡ q.| |¡ q.| j j 	ddd ¡}|rê| d¡ | d 
|¡¡ | j j ddg ¡}	|	D ]}
| d¡ | |
¡ q | j j ddd
¡r:| d¡ |rT| d¡ | |¡ | j j 	ddd ¡}| j j 	ddd ¡}|rš| d¡ | tt|ƒƒ¡ |r¼| d¡ | tt|ƒƒ¡ | j j ddg ¡}|D ]"}| d¡ | tt|ƒƒ¡ qÒ| j j ddg ¡}|D ]"}| d¡ | tt|ƒƒ¡ q| j j ddg ¡}|D ]L}| d ¡ d!|krn| d!¡\}}n|}|}| tt|ƒƒd! | ¡ qF| j j dd"g ¡}|D ]L}| d#¡ d!|krÒ| d!¡\}}n|}d$}| tt|ƒƒd! | ¡ qª| j j dd%d$¡}|D ]}| d& 
|¡¡ q| j j 	dd'd(¡}|d(krR| d) 
|¡¡ | j j 	dd*d+¡}|d+kr~| d, 
|¡¡ | j j 	dd-d$¡}|r°| d. 
t|d/ƒ ¡ ¡¡ | j j 	dd0d$¡}|rþt|d/ƒ ¡  d1d2¡ d3d4¡ d5d4¡}| d6 
|¡¡ | j j dd7g ¡} | D ]}!| d8¡ | |!¡ q| j j 	dd9d ¡}"|"rb| d:¡ | d 
|"¡¡ | j j 	dd;d<¡}#|#r„| d=¡ | jD ]}$| d>¡ | |$¡ qŠ|  |¡ d S )?Nr   r  z--bootstrapz--dist_namer   r­   r×   Úreleasez	--releaseTz--signú--windowz--sdkz--android_apizandroid.presplash_colorz--presplash-colorz{}Úservicesz	--servicer  r  r  zandroid.whitelist_srczandroid.blacklist_srcz--whitelistz--blacklistzandroid.add_srcz--add-sourcezandroid.add_aarsz	--add-aarzandroid.add_assetsz--add-assetr‰   zandroid.add_resourcesz--add-resourcer   zandroid.uses_libraryz--uses-library={}r&   r'   z--activity-class-name={}zandroid.service_class_namezorg.kivy.android.PythonServicez--service-class-name={}zandroid.extra_manifest_xmlz--extra-manifest-xml="{}"Úrtz,android.extra_manifest_application_argumentsrZ   z\"r[   r\   ú	z+--extra-manifest-application-arguments="{}"zandroid.gradle_dependenciesz--dependzandroid.manifest_placeholdersz--manifest-placeholderszandroid.no-byte-compile-pythonFz--no-byte-compile-pythonz--arch)r*   r+   rm   r  Úartifact_formatr8   r;   Úcheck_p4a_sign_envr<   r7   r2   r.   rÐ   r   r   r>   rc   r   re   r0   rT   )%r@   Ú	build_cmdr  r  rS   rA   ÚoptionÚvaluesZpresplash_colorr%  ZserviceZwhitelist_srcZblacklist_srcZjavadirsZjavadirZaarsÚaarZassetsZassetZ	asset_srcZ
asset_destÚ	resourcesÚresourceZresource_srcZresource_destZuses_libraryÚlibrG   Zservice_class_nameZextra_manifest_xmlZ$extra_manifest_application_argumentsZ	args_bodyZgradle_dependenciesZgradle_dependencyZmanifest_placeholdersZno_byte_compiler  rJ   rJ   rK   Úexecute_build_package
  sä    
















  ÿ  ÿ
  ÿ
  ÿ  ÿ&




z#TargetAndroid.execute_build_packagec                 C   s   |   ¡ s| jdkrdS dS )N)r”   r-  r#  zrelease-unsigned)r)  r(  rs   rJ   rJ   rK   Úget_release_mode—  s    zTargetAndroid.get_release_modeFc                 C   sL   ddddg}d}|D ]2}d  |¡}|tjkr|rB| j d  |¡¡ d}q|S )	NZKEYALIASZKEYSTORE_PASSWDZKEYSTOREZKEYALIAS_PASSWDTzP4A_RELEASE_{}z=Asking for release but {} is missing--sign will not be passedF)r2   r_   r
   r*   r-   )r@   r-   ÚkeysÚcheckrß   rJ   rJ   rK   r)    s    

ÿÿz TargetAndroid.check_p4a_sign_envc                    sî   | j j dd¡}|s&| j j ddd¡ tƒ j|Ž  | j j ddd¡}|  ¡ }| jD ]Z}|| j jd< | j  	d 
|¡¡ | j j| jf| jdddd	|› d
|› d|f•| j jd qR| j j dd ¡ |  ¡ rÈqÞtdƒ | j  	d¡ q¾| j  	d¡ d S )Nr   úandroid.entrypointr'   ÚANDROID_SERIALz	Run on {}ÚshellÚamÚstartz-nrñ   z-ar¡   gš™™™™™¹?z!Waiting for application to start.zApplication started.)r*   r+   r7   Úsetr(   Úcmd_runÚ_get_packageÚserialsr
   rf   r2   rS   rŽ   r‘   ry   ro   Ú_get_pidr   )r@   rA   Ú
entrypointÚpackageÚserialrH   rJ   rK   r;  ª  sH     ÿ  ÿ
ÿ÷ôzTargetAndroid.cmd_runc                 G   sh   |   ¡  |  ¡  |d }|rZ|d dkrZtdƒ td | j¡ƒ tj d | j| j	¡¡ n
|  
|¡ dS )zd
        Run p4a commands. Args must come after --, or
        use --alias to make an alias
        r   ú--aliasz-To set up p4a in this shell session, execute:z9    alias p4a=$(buildozer {} p4a --alias 2>&1 >/dev/null)zPYTHONPATH={} {}
N)r“   rï   Úprintr2   Ú
targetnamer5   ÚstderrÚwriterR   r6   rT   ©r@   rA   rJ   rJ   rK   Úcmd_p4aÓ  s    ÿzTargetAndroid.cmd_p4ac                 G   s   |   dg¡ |   dg¡ dS )z2
        Clean the build and distribution
        Zclean_buildsZclean_distsNr–   rG  rJ   rJ   rK   Ú	cmd_cleanã  s    zTargetAndroid.cmd_cleanc                 C   s:   | j j}| ddd¡}| dd¡}|r2|d | }| ¡ S )Nr   zpackage.domainr   r  Ú.)r*   r+   r7   rm   Úlower)r@   r+   Zpackage_domainr@  rJ   rJ   rK   r<  ê  s    zTargetAndroid._get_packagec              	   C   sP   | j j dd¡pg }t|dƒ}t|dƒ}|D ]}| |d ¡ q.W 5 Q R X d S )Nr   zandroid.whitelistzwhitelist.txtÚwr[   )r*   r+   r.   r   rc   rF  )r@   Údist_dirZp4a_whitelistZwhitelist_fnr  ZwlrJ   rJ   rK   Ú_generate_whitelistò  s     ÿÿ
z!TargetAndroid._generate_whitelistc           A         s  | j j dd¡}|  |¡‰| j j}|  ¡ }| j  ¡ }dD ]r\}}| d|g ¡}|sTq8|| jkr`q8| j  d 	|¡¡ | j  
|¡D ]*}| j  t| j j|ƒtˆd|t|ƒƒ¡ q~q8|  ˆ¡ |  ˆ¡ d| dd¡fd|fd	|fd
| dd| j¡fd| dd| j¡fg}	| ddd¡}
|
r*|	d| j jfg7 }	n|	d| j jfg7 }	| ddg ¡}|D ]}|	d|fg7 }	qN| ddg ¡}|D ]}|	d|fg7 }	qv| ddg ¡}|D ]}|	dt| j j|ƒfg7 }	qž| ddd¡}|	d|fg7 }	| ddd¡}|	d|fg7 }	| ddg ¡}|D ]}|	d|fg7 }	q| ddg ¡}|D ]}|	d |fg7 }	q0| dd!g ¡}|D ]}|	d"|fg7 }	qX| dd#g ¡}|D ]8}| d$d%¡\}}d& 	| ¡ | ¡ ¡}|	d'|fg7 }	q€| dd(g ¡}|D ]T}t| j j|ƒ}tt| ¡ ƒƒ}|r|D ]} |	d)| fg7 }	qøntd* 	|¡ƒ‚qÌ| dd+g ¡}!|!D ]}"|	d,|"fg7 }	q4| dd-d.¡}#|#rx|	d/t| j j|#ƒfg7 }	n,| dd0d.¡}#|#r¤|	d1t| j j|#ƒfg7 }	| dd2d.¡}$|$rÐ|	d3t| j j|$ƒfg7 }	| dd4d.¡}%| dd5d.¡}&|%r(|&r(|	d6t| j j|%ƒfg7 }	|	d7t| j j|&ƒfg7 }	| dd8d.¡ ¡ }'|'rŒ|'d9krXtd: 	|'¡ƒ‚| dd;d.¡}(|	d<|'fg7 }	|	d=t| j j|(ƒfg7 }	| dd>d?¡d@krè| ddAdBg¡})|)D ]}*|	dC|*fg7 }	q´| ddDd¡}+|+sè|	dEg7 }	| ddFdG¡},|,r|	dHg7 }	| ddI| jdJk¡}-|-r*|	dKg7 }	| ddLd.¡}.|.rV|	dMt| j j|.ƒfg7 }	| ddNd.¡}/|/rx|	dO|/fg7 }	| ddPd.¡}0|0rš|	dQ|0fg7 }	| ddR¡}1|1rº|	dS|1fg7 }	| ddTd¡}2|2sØ|	dUg7 }	| ddVd.¡}3|3r|	dWt| j j|3ƒfg7 }	| jdXkr$|	dYg7 }	dX}4|4}5n|	dZg7 }	d[}5|  ¡ }4|  |	¡ z&| j   d\¡ |  |	¡ | j   d]¡ W n   Y nX t! "t| j#d^ƒ¡}6t$|6t%d_}6|6d` }7dadbdcg}8|7ddkoÆt&‡fdedf„|8D ƒƒ}9| dd¡}:|9rLtˆƒ};dgj	|;|4| j'dh}<| j'dikrtˆdjdkdi|5ƒ}=n8| j'dlkr0tˆdjdkdm|5ƒ}=n| j'dnkr¤tˆdjdkdnƒ}=nXdo‰ | dd¡}>t(|>dpƒrr|> )dq¡}>d. ‡ fdrds„|>D ƒ¡}?dtj	|?||4du}<tˆdvƒ}=dwj	|:|4|| j*| j'dx}@t+t|=|<ƒt| j j,|@ƒƒ | j  -dy¡ | j  -dz 	|@¡¡ |@| j j.d{< | j| j j.d|< d S )}Nr   r  ))zandroid.add_libs_armeabiZarmeabi)zandroid.add_libs_armeabi_v7ar   )zandroid.add_libs_arm64_v8ar   )zandroid.add_libs_x86rµ   )zandroid.add_libs_mipsZmipszSearch and copy libs for {}Zlibsz--nameÚtitlez	--versionz	--packagez--minsdkrw   z	--ndk-apizandroid.private_storageTz	--privatez--dirzandroid.permissionsz--permissionzandroid.featuresz	--featurezandroid.res_xmlz	--res_xmlr5  r'   z--android-entrypointzandroid.appthemez@android:style/Theme.NoTitleBarz--android-appthemezandroid.add_compile_optionsz--add-compile-optionzandroid.add_gradle_repositoriesz--add-gradle-repositoryzandroid.add_packaging_optionsz--add-packaging-optionzandroid.meta_dataú=r­   z{}={}z--meta-datazandroid.add_jarsz	--add-jarzFailed to find jar file: {}zandroid.add_activitiesz--add-activityzandroid.presplash_lottier   z--presplash-lottiezpresplash.filenamez--presplashzicon.filenamez--iconz!icon.adaptive_foreground.filenamez!icon.adaptive_background.filenamez	--icon-fgz	--icon-bgzandroid.ouya.category)ZGAMEZAPPz>Invalid android.ouya.category: "{}" must be one of GAME or APPzandroid.ouya.icon.filenamez--ouya-categoryz--ouya-iconr"   r#   Zservice_onlyÚorientationZ	landscapez--orientationÚ
fullscreen)r$  zandroid.wakelockF)z
--wakelockzandroid.enable_androidxZ28)z--enable-androidxzandroid.manifest.intent_filtersz--intent-filterszandroid.manifest.launch_modez--activity-launch-modezandroid.manifest.orientationz--manifest-orientationzandroid.numeric_versionz--numeric-versionzandroid.allow_backup)z--allow-backupÚfalsezandroid.backup_rulesz--backup-rulesr×   )r×   )r#  r#  Zandroid_pre_build_apkZandroid_post_build_apkrã   )rß   rÝ   zbuild.gradleZgradleZgradlewz25.0c                 3   s   | ]}t tˆ |ƒƒV  qd S )N)r   r   ©r  Úx)rM  rJ   rK   Ú	<genexpr>ã  s     z.TargetAndroid.build_package.<locals>.<genexpr>z&{packagename}-{mode}.{artifact_format})ÚpackagenameÚmoder(  ÚapkÚbuildÚoutputsr”   Zbundler-  z'" ,Údecodeúutf-8c                    s   g | ]}|ˆ kr|‘qS rJ   rJ   rT  )ÚblrJ   rK   r  ø  s      z/TargetAndroid.build_package.<locals>.<listcomp>z{title}-{version}-{mode}.apk)rO  r}   rX  r   z7{packagename}-{version}-{arch}-{mode}.{artifact_format})rW  rX  r}   r  r(  zAndroid packaging done!z&APK {0} available in the bin directoryúandroid:latestapkúandroid:latestmode)/r*   r+   rm   r"  r<  Úget_versionr.   r0   r×   r2   Zfile_matchesZ	file_copyr   Úroot_dirr   Ú_update_libraries_referencesrN  r7   r:   rÐ   Zapp_dirZgetlistvaluesr>   rÆ   r   r   r«   Úupperrv   Z
build_moder2  r1  rD   r_   rØ   rl   ræ   r   rÿ   r(  Úhasattrr\  r3   r   Úbin_dirrf   rå   )Ar@   r  r+   r@  r}   Z
config_keyÚlib_dirÚpatternsÚfnr*  Zis_private_storageÚpermissionsZ
permissionÚfeaturesZfeatureZxmlfilesZxmlfiler?  ZappthemeZcompile_optionsr+  ZreposÚrepoZ
pkgoptionsZ	pkgoptionZ
meta_datasÚmetarß   rO   Zadd_jarsÚpatternÚmatchesÚjarZadd_activitiesZactivityZ	presplashZiconZicon_fgZicon_bgZouya_categoryZ	ouya_iconrQ  ZorientrR  ZwakelockZenable_androidxZintent_filtersZlaunch_modeZmanifest_orientationZnumeric_versionZallow_backupZbackup_rulesrX  Z	mode_signrÊ   Zbuild_tools_versionZgradle_filesZis_gradle_buildrW  Zpackagename_srcZartifactZartifact_dirZapptitleZapktitleZartifact_destrJ   )r^  rM  rK   Úbuild_packageú  sÀ   


þ


ÿ
ÿú	  ÿÿÿ
ÿÿ
ÿ
ÿÿÿÿ


þ
  ÿÿ
  ÿ  ÿ
ÿ





ÿ  ÿ
ý
   þÿzTargetAndroid.build_packagec              	   C   s¬  t |dƒ}| j |¡s0d | j¡d | j¡g}n"tj|dd}| ¡ }W 5 Q R X g }|d d … D ]}| 	d¡srqb| 
|¡ qb| jj ddg ¡}tt| jj dd	d
¡ƒƒ}|D ]V}	tt ||	ƒƒ}
| j |
¡sè| j d |	¡¡ t d¡ t|
tt|ƒƒƒ}
| |
¡ q®tj|ddd€}z| dd„ |D ƒ¡ W n   | |¡ Y nX |rh|d  d¡sh| d¡ t|ƒD ] \}}
| d |d |
¡¡ qpW 5 Q R X | j d¡ d S )Nzproject.propertiesztarget=android-{}
zAPP_PLATFORM={}
r]  )Úencodingzandroid.library.reference.r   zandroid.library_referencesz
source.dirrJ  z.Invalid library reference (path not found): {}r­   rL  c                 s   s   | ]}|  d ¡V  qdS )r]  N)r\  )r  rg   rJ   rJ   rK   rV  5  s     z=TargetAndroid._update_libraries_references.<locals>.<genexpr>rÝ   r[   z android.library.reference.{}={}
zproject.properties updated)r   r*   r   r2   rv   r:   Úiorc   Ú	readlinesrd   Úremover+   r.   r   r   r7   r-   r5   r  r   r;   Ú
writelinesÚendswithrF  Ú	enumerater×   )r@   rM  Z
project_fnÚcontentr  Z
referencesrg   Zapp_referencesÚ
source_dirZcrefÚrefÚindexrJ   rJ   rK   rc    sV    


þ
  ÿ  ÿÿÿ

$z*TargetAndroid._update_libraries_referencesc                 C   s’   t | dƒr| jS t d¡}|r(| d¡S | jj| jf| jd
•ddd  	¡ }g }|D ]2}|s^qT| 
d¡sT| 
d	¡rtqT| | ¡ d ¡ qT|| _|S )NÚ_serialsr6  r  ÚdevicesTr  r   Ú*zList )r~  )re  r}  r
   rm   r>   r*   rS   rŽ   r‘   Ú
splitlinesrd   r;   )r@   rA  rÉ   r=  rJ   rJ   rK   r=  ?  s(    


 ÿþzTargetAndroid.serialsc                 G   sp   |   ¡  |  ¡  |d }|rT|d dkrTtdƒ td | j¡ƒ tj | jd ¡ n| j	 
| jf| j|•¡ dS )zx
        Run adb from the Android SDK.
        Args must come after --, or use
        --alias to make an alias
        r   rB  z-To set up ADB in this shell session, execute:z9    alias adb=$(buildozer {} adb --alias 2>&1 >/dev/null)r[   N)r“   rï   rC  r2   rD  r5   rE  rF  rŽ   r*   rS   r‘   rG  rJ   rJ   rK   Úcmd_adbS  s    ÿzTargetAndroid.cmd_adbc                    sæ   t ƒ j|Ž  | jj}d|kr(| j d¡ | dd¡dkrH| j d¡ d S |d }t| jj|ƒ}| j |¡sv| j d¡ | j	D ]H}|| jj
d< | j d	 |¡¡ | jj| jf| jd
d|f•| jjd q|| jj
 dd ¡ | j d¡ d S )Nr_  z$No APK built yet. Run "debug" first.r`  r   r×   z'Only debug APK are supported for deployz9Unable to found the latest APK. Please run "debug" again.r6  zDeploy on {}rû   z-rr¡   zApplication pushed.)r(   Ú
cmd_deployr*   rå   r-   rm   r   rf  r   r=  r
   rf   r2   rS   rŽ   r‘   ry   ro   )r@   rA   rå   rY  Zfull_apkrA  rH   rJ   rK   r‚  d  s,    ÿ
þzTargetAndroid.cmd_deployc                 C   s@   | j j| jf| jdd|  ¡ f•ddddd^}}|r<| ¡ S dS )Nr7  ZpidofTF)rk   rÍ   r•   Úquiet)r*   rS   rŽ   r‘   r<  rÆ   )r@   Úpidr‚   rJ   rJ   rK   r>    s     ÿûõ
zTargetAndroid._get_pidc                 G   sâ   |   ¡  | jdd… }|sdS | jjjdddddd}d |¡}|d | jjd	< g }d}| jj dd
¡r‚|  ¡ }|r‚| 	d|f¡ | jj
| jf| jd|f|•| jjd|r®| jnddd | j |  ¡ › d¡ | jj d	d¡ dS )z%Show the log from the device
        r   Nr   zandroid.logcat_filtersr   r‰   r\   )Zsection_sepZ
split_charr6  zandroid.logcat_pid_onlyz--pidZlogcatTF)rP   rÍ   Zrun_conditionr•   z terminated)r“   r=  r*   r+   Zgetrawdefaultr   r
   r7   r>  r<   rS   rŽ   r‘   ry   rf   r<  ro   )r@   rA   rA  ÚfiltersÚ
extra_argsr„  rJ   rJ   rK   Ú
cmd_logcat“  s8        ÿ
ûzTargetAndroid.cmd_logcat)F)<Ú__name__Ú
__module__Ú__qualname__rD  rV   rü   rý   rþ   r]   r9   r)   r?   rT   ÚpropertyrR   ri   rq   rt   rv   r:   rl   r~   r€   rn   r3   r“   r˜   r‹   r   r§   r¬   rÃ   rÌ   rÕ   rÜ   râ   rê   rç   rï   rí   r  r   r"  r  r1  r2  r)  r;  rH  rI  r<  rN  rq  rc  r=  r  r‚  r>  r‡  Ú__classcell__rJ   rJ   rH   rK   r   <   sŠ   6

#








	
0	 ?AV# 
)  3
r   c                 C   s   d| _ t| ƒS )Nr   )rD  r   )r*   rJ   rJ   rK   Ú
get_target²  s    r  )3Ú__doc__r5   r   ÚNotImplementedErrorr   rK  ZWSLru   rx   r   r^   rŒ   r_   rs  r¹   r  r   r*   r   r   Zbuildozer.targetr	   r
   Úos.pathr   r   r   r   r   r   r   Úshutilr   r   r   r=   rÒ   r   Útimer   Zbuildozer.libs.versionr   Zdistutils.versionr   rL   rª   r/   r2   rb   r   r  rJ   rJ   rJ   rK   Ú<module>   s^   
 þÿ           