From 016018513efad46f38f3c638be6f53f128b71aaf Mon Sep 17 00:00:00 2001 From: Mahendra Liya Date: Mon, 10 Apr 2023 05:11:38 +0530 Subject: [PATCH] feat: add monochrome app icon support (#1550) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added the monochrome version for Cordova's icon * android: modified the ic_launcher.xml to include the monochrome drawable * android: replaced monochrome image with rasterized images * android: Added support for custom monochrome icons defined in config.xml * android: Updated Tests * android: wrapped inside if(monochrome) * android: Update templates/project/res/mipmap-hdpi-v26/ic_launcher.xml Co-authored-by: エリス * Update lib/prepare.js Co-authored-by: エリス * android: Update templates/project/res/mipmap-ldpi-v26/ic_launcher.xml Co-authored-by: エリス * android: Update templates/project/res/mipmap-mdpi-v26/ic_launcher.xml Co-authored-by: エリス * android Update templates/project/res/mipmap-xhdpi-v26/ic_launcher.xml Co-authored-by: エリス * android: Update templates/project/res/mipmap-xxhdpi-v26/ic_launcher.xml Co-authored-by: エリス * android: Update templates/project/res/mipmap-xxxhdpi-v26/ic_launcher.xml Co-authored-by: エリス * android: Update lib/prepare.js Co-authored-by: エリス * Resolved lint errors * fix: test failure --------- Co-authored-by: エリス --- lib/prepare.js | 59 +++++++++++++++++- spec/unit/prepare.spec.js | 33 +++++++--- .../res/mipmap-hdpi-v26/ic_launcher.xml | 3 +- .../ic_launcher_monochrome.png | Bin 0 -> 1400 bytes .../res/mipmap-ldpi-v26/ic_launcher.xml | 3 +- .../res/mipmap-mdpi-v26/ic_launcher.xml | 3 +- .../ic_launcher_monochrome.png | Bin 0 -> 916 bytes .../res/mipmap-xhdpi-v26/ic_launcher.xml | 3 +- .../ic_launcher_monochrome.png | Bin 0 -> 1829 bytes .../res/mipmap-xxhdpi-v26/ic_launcher.xml | 3 +- .../ic_launcher_monochrome.png | Bin 0 -> 2911 bytes .../res/mipmap-xxxhdpi-v26/ic_launcher.xml | 3 +- .../ic_launcher_monochrome.png | Bin 0 -> 4025 bytes 13 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 templates/project/res/mipmap-hdpi-v26/ic_launcher_monochrome.png create mode 100644 templates/project/res/mipmap-mdpi-v26/ic_launcher_monochrome.png create mode 100644 templates/project/res/mipmap-xhdpi-v26/ic_launcher_monochrome.png create mode 100644 templates/project/res/mipmap-xxhdpi-v26/ic_launcher_monochrome.png create mode 100644 templates/project/res/mipmap-xxxhdpi-v26/ic_launcher_monochrome.png diff --git a/lib/prepare.js b/lib/prepare.js index 9469b039..5a93f9e4 100644 --- a/lib/prepare.js +++ b/lib/prepare.js @@ -703,8 +703,10 @@ function updateIcons (cordovaProject, platformResourcesDir) { mapImageResources(cordovaProject.root, platformResourcesDir, 'mipmap', 'ic_launcher.png'), mapImageResources(cordovaProject.root, platformResourcesDir, 'mipmap', 'ic_launcher_foreground.png'), mapImageResources(cordovaProject.root, platformResourcesDir, 'mipmap', 'ic_launcher_background.png'), + mapImageResources(cordovaProject.root, platformResourcesDir, 'mipmap', 'ic_launcher_monochrome.png'), mapImageResources(cordovaProject.root, platformResourcesDir, 'mipmap', 'ic_launcher_foreground.xml'), mapImageResources(cordovaProject.root, platformResourcesDir, 'mipmap', 'ic_launcher_background.xml'), + mapImageResources(cordovaProject.root, platformResourcesDir, 'mipmap', 'ic_launcher_monochrome.xml'), mapImageResources(cordovaProject.root, platformResourcesDir, 'mipmap', 'ic_launcher.xml') ); @@ -728,17 +730,23 @@ function updateIconResourceForAdaptive (preparedIcons, resourceMap, platformReso // project's config.xml location, so we use it as base path. let background; let foreground; + let monochrome; let targetPathBackground; let targetPathForeground; + let targetPathMonochrome; for (const density in android_icons) { let backgroundVal = '@mipmap/ic_launcher_background'; let foregroundVal = '@mipmap/ic_launcher_foreground'; + const monochromeVal = '@mipmap/ic_launcher_monochrome'; background = android_icons[density].background; foreground = android_icons[density].foreground; + monochrome = android_icons[density].monochrome; - if (!background || !foreground) { + const isAdaptiveIcon = background && foreground; + const isMonochromeIcon = monochrome && isAdaptiveIcon; + if (!isMonochromeIcon || !isAdaptiveIcon) { // This icon isn't an adaptive icon, so skip it continue; } @@ -769,12 +777,34 @@ function updateIconResourceForAdaptive (preparedIcons, resourceMap, platformReso resourceMap[targetPathForeground] = android_icons[density].foreground; } + if (monochrome) { + if (path.extname(path.basename(monochrome)) === '.xml') { + // Vector Use Case + targetPathMonochrome = getAdaptiveImageResourcePath(platformResourcesDir, 'mipmap', density, 'ic_launcher_monochrome.xml', path.basename(android_icons[density].monochrome)); + resourceMap[targetPathMonochrome] = android_icons[density].monochrome; + } else if (path.extname(path.basename(monochrome)) === '.png') { + // Images Use Case + targetPathMonochrome = getAdaptiveImageResourcePath(platformResourcesDir, 'mipmap', density, 'ic_launcher_monochrome.png', path.basename(android_icons[density].monochrome)); + resourceMap[targetPathMonochrome] = android_icons[density].monochrome; + } + } + // create an XML for DPI and set color - const icLauncherTemplate = ` + let icLauncherTemplate = ''; + if (monochrome) { + icLauncherTemplate = ` + + + + +`; + } else { + icLauncherTemplate = ` `; + } const launcherXmlPath = path.join(platformResourcesDir, 'mipmap-' + density + '-v26', 'ic_launcher.xml'); @@ -788,6 +818,7 @@ function updateIconResourceForAdaptive (preparedIcons, resourceMap, platformReso if (default_icon && !android_icons.mdpi) { let defaultTargetPathBackground; let defaultTargetPathForeground; + let defaultTargetPathMonochrome; if (background.startsWith('@color')) { // Colors Use Case @@ -814,6 +845,18 @@ function updateIconResourceForAdaptive (preparedIcons, resourceMap, platformReso defaultTargetPathForeground = getAdaptiveImageResourcePath(platformResourcesDir, 'mipmap', 'mdpi', 'ic_launcher_foreground.png', path.basename(default_icon.foreground)); resourceMap[defaultTargetPathForeground] = default_icon.foreground; } + + if (monochrome) { + if (path.extname(path.basename(monochrome)) === '.xml') { + // Vector Use Case + defaultTargetPathMonochrome = getAdaptiveImageResourcePath(platformResourcesDir, 'mipmap', 'mdpi', 'ic_launcher_monochrome.xml', path.basename(default_icon.monochrome)); + resourceMap[defaultTargetPathMonochrome] = default_icon.monochrome; + } else if (path.extname(path.basename(monochrome)) === '.png') { + // Images Use Case + defaultTargetPathMonochrome = getAdaptiveImageResourcePath(platformResourcesDir, 'mipmap', 'mdpi', 'ic_launcher_monochrome.png', path.basename(default_icon.monochrome)); + resourceMap[defaultTargetPathMonochrome] = default_icon.monochrome; + } + } } return resourceMap; @@ -884,6 +927,11 @@ function prepareIcons (icons) { const favor = {}; // populating found icon. + if (icon.background && icon.foreground && icon.monochrome) { + found.background = icon.background; + found.foreground = icon.foreground; + found.monochrome = icon.monochrome; + } if (icon.background && icon.foreground) { found.background = icon.background; found.foreground = icon.foreground; @@ -892,6 +940,11 @@ function prepareIcons (icons) { found.src = icon.src; } + if (default_icon.background && default_icon.foreground && default_icon.monochrome) { + favor.background = default_icon.background; + favor.foreground = default_icon.foreground; + favor.monochrome = default_icon.monochrome; + } if (default_icon.background && default_icon.foreground) { favor.background = default_icon.background; favor.foreground = default_icon.foreground; @@ -929,8 +982,10 @@ function cleanIcons (projectRoot, projectConfig, platformResourcesDir) { mapImageResources(projectRoot, platformResourcesDir, 'mipmap', 'ic_launcher.png'), mapImageResources(projectRoot, platformResourcesDir, 'mipmap', 'ic_launcher_foreground.png'), mapImageResources(projectRoot, platformResourcesDir, 'mipmap', 'ic_launcher_background.png'), + mapImageResources(projectRoot, platformResourcesDir, 'mipmap', 'ic_launcher_monochrome.png'), mapImageResources(projectRoot, platformResourcesDir, 'mipmap', 'ic_launcher_foreground.xml'), mapImageResources(projectRoot, platformResourcesDir, 'mipmap', 'ic_launcher_background.xml'), + mapImageResources(projectRoot, platformResourcesDir, 'mipmap', 'ic_launcher_monochrome.xml'), mapImageResources(projectRoot, platformResourcesDir, 'mipmap', 'ic_launcher.xml') ); diff --git a/spec/unit/prepare.spec.js b/spec/unit/prepare.spec.js index be541b83..56ee3cc5 100644 --- a/spec/unit/prepare.spec.js +++ b/spec/unit/prepare.spec.js @@ -51,8 +51,10 @@ function createResourceMap (target) { if (!target || target === 'ic_launcher.png') resources[path.join(PATH_RESOURCE, mipmap, 'ic_launcher.png')] = null; if (!target || target === 'ic_launcher_foreground.png') resources[path.join(PATH_RESOURCE, mipmap, 'ic_launcher_foreground.png')] = null; if (!target || target === 'ic_launcher_background.png') resources[path.join(PATH_RESOURCE, mipmap, 'ic_launcher_background.png')] = null; + if (!target || target === 'ic_launcher_background.png') resources[path.join(PATH_RESOURCE, mipmap, 'ic_launcher_monochrome.png')] = null; if (!target || target === 'ic_launcher_foreground.xml') resources[path.join(PATH_RESOURCE, mipmap, 'ic_launcher_foreground.xml')] = null; if (!target || target === 'ic_launcher_background.xml') resources[path.join(PATH_RESOURCE, mipmap, 'ic_launcher_background.xml')] = null; + if (!target || target === 'ic_launcher_background.xml') resources[path.join(PATH_RESOURCE, mipmap, 'ic_launcher_monochrome.xml')] = null; if ( !mipmap.includes('-v26') && @@ -136,10 +138,14 @@ describe('prepare', () => { return createResourceMap('ic_launcher_foreground.png'); } else if (resourceName.includes('ic_launcher_background.png')) { return createResourceMap('ic_launcher_background.png'); + } else if (resourceName.includes('ic_launcher_monochrome.png')) { + return createResourceMap('ic_launcher_monochrome.png'); } else if (resourceName.includes('ic_launcher_foreground.xml')) { return createResourceMap('ic_launcher_foreground.xml'); } else if (resourceName.includes('ic_launcher_background.xml')) { return createResourceMap('ic_launcher_background.xml'); + } else if (resourceName.includes('ic_launcher_monochrome.xml')) { + return createResourceMap('ic_launcher_monochrome.xml'); } else if (resourceName.includes('ic_launcher.xml')) { return createResourceMap('ic_launcher.xml'); } @@ -305,7 +311,9 @@ describe('prepare', () => { return [mockGetIconItem({ density: 'mdpi', background: 'res/icon/android/mdpi-background.png', - foreground: 'res/icon/android/mdpi-foreground.xml' + foreground: 'res/icon/android/mdpi-foreground.xml', + monochrome: 'res/icon/android/mdpi-monochrome.png' + })]; }; @@ -343,7 +351,8 @@ describe('prepare', () => { return [mockGetIconItem({ density: 'mdpi', background: 'res/icon/android/mdpi-background.png', - foreground: 'res/icon/android/mdpi-foreground.png' + foreground: 'res/icon/android/mdpi-foreground.png', + monochrome: 'res/icon/android/mdpi-monochrome.png' })]; }; @@ -352,6 +361,7 @@ describe('prepare', () => { const phaseOneModification = {}; phaseOneModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_foreground.png')] = 'res/icon/android/mdpi-foreground.png'; phaseOneModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_background.png')] = 'res/icon/android/mdpi-background.png'; + phaseOneModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_monochrome.png')] = 'res/icon/android/mdpi-monochrome.png'; const phaseOneUpdatedIconsForAdaptive = Object.assign({}, resourceMap, phaseOneModification); updateIconResourceForAdaptiveSpy = jasmine.createSpy('updateIconResourceForAdaptiveSpy'); @@ -363,6 +373,7 @@ describe('prepare', () => { const phaseTwoModification = {}; phaseTwoModification[path.join(PATH_RESOURCE, 'mipmap-mdpi', 'ic_launcher.png')] = 'res/icon/android/mdpi-foreground.png'; phaseTwoModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_background.png')] = 'res/icon/android/mdpi-background.png'; + phaseTwoModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_monochrome.png')] = 'res/icon/android/mdpi-monochrome.png'; const phaseTwoUpdatedIconsForLegacy = Object.assign({}, phaseOneUpdatedIconsForAdaptive, phaseTwoModification); updateIconResourceForLegacySpy = jasmine.createSpy('updateIconResourceForLegacySpy'); @@ -400,7 +411,8 @@ describe('prepare', () => { density: 'mdpi', src: 'res/icon/android/mdpi-icon.png', background: 'res/icon/android/mdpi-background.png', - foreground: 'res/icon/android/mdpi-foreground.png' + foreground: 'res/icon/android/mdpi-foreground.png', + monochrome: 'res/icon/android/mdpi-monochrome.png' })]; }; @@ -409,6 +421,7 @@ describe('prepare', () => { const phaseOneModification = {}; phaseOneModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_foreground.png')] = 'res/icon/android/mdpi-foreground.png'; phaseOneModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_background.png')] = 'res/icon/android/mdpi-background.png'; + phaseOneModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_monochrome.png')] = 'res/icon/android/mdpi-monochrome.png'; const phaseOneUpdatedIconsForAdaptive = Object.assign({}, resourceMap, phaseOneModification); updateIconResourceForAdaptiveSpy = jasmine.createSpy('updateIconResourceForAdaptiveSpy'); @@ -420,6 +433,7 @@ describe('prepare', () => { const phaseTwoModification = {}; phaseTwoModification[path.join(PATH_RESOURCE, 'mipmap-mdpi', 'ic_launcher.png')] = 'res/icon/android/mdpi-foreground.png'; phaseTwoModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_background.png')] = 'res/icon/android/mdpi-background.png'; + phaseTwoModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_monochrome.png')] = 'res/icon/android/mdpi-monochrome.png'; const phaseTwoUpdatedIconsForLegacy = Object.assign({}, phaseOneUpdatedIconsForAdaptive, phaseTwoModification); updateIconResourceForLegacySpy = jasmine.createSpy('updateIconResourceForLegacySpy'); @@ -511,13 +525,15 @@ describe('prepare', () => { const ldpi = mockGetIconItem({ density: 'ldpi', background: 'res/icon/android/ldpi-background.png', - foreground: 'res/icon/android/ldpi-foreground.png' + foreground: 'res/icon/android/ldpi-foreground.png', + monochrome: 'res/icon/android/ldpi-monochrome.png' }); const mdpi = mockGetIconItem({ density: 'mdpi', background: 'res/icon/android/mdpi-background.png', - foreground: 'res/icon/android/mdpi-foreground.png' + foreground: 'res/icon/android/mdpi-foreground.png', + monochrome: 'res/icon/android/mdpi-monochrome.png' }); const icons = [ldpi, mdpi]; @@ -614,7 +630,8 @@ describe('prepare', () => { mdpi: mockGetIconItem({ density: 'mdpi', background: 'res/icon/android/mdpi-background.png', - foreground: 'res/icon/android/mdpi-foreground.png' + foreground: 'res/icon/android/mdpi-foreground.png', + monochrome: 'res/icon/android/mdpi-monochrome.png' }) }, default_icon: undefined @@ -636,6 +653,7 @@ describe('prepare', () => { const expectedModification = {}; expectedModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_background.png')] = 'res/icon/android/mdpi-background.png'; expectedModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_foreground.png')] = 'res/icon/android/mdpi-foreground.png'; + expectedModification[path.join(PATH_RESOURCE, 'mipmap-mdpi-v26', 'ic_launcher_monochrome.png')] = 'res/icon/android/mdpi-monochrome.png'; const expected = Object.assign({}, resourceMap, expectedModification); const actual = updateIconResourceForAdaptive(preparedIcons, resourceMap, platformResourcesDir); @@ -668,7 +686,8 @@ describe('prepare', () => { const icons = [mockGetIconItem({ density: 'mdpi', background: 'res/icon/android/mdpi-background.png', - foreground: 'res/icon/android/mdpi-foreground.png' + foreground: 'res/icon/android/mdpi-foreground.png', + monochrome: 'res/icon/android/mdpi-monochrome.png' })]; const projectRoot = '/mock'; const projectConfig = { diff --git a/templates/project/res/mipmap-hdpi-v26/ic_launcher.xml b/templates/project/res/mipmap-hdpi-v26/ic_launcher.xml index be316184..cf79c3d7 100644 --- a/templates/project/res/mipmap-hdpi-v26/ic_launcher.xml +++ b/templates/project/res/mipmap-hdpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ - \ No newline at end of file + + diff --git a/templates/project/res/mipmap-hdpi-v26/ic_launcher_monochrome.png b/templates/project/res/mipmap-hdpi-v26/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..d13e3f5711189f7aa4a78725222b935e3eed050b GIT binary patch literal 1400 zcma)6`#%#36rbDNSRq}sP13x=l2^E`BsG_XHR>v}#Lc)Kb7QyUnml@4*Tz0WnPh1+ zG8-F_*Ge~SHj~>T@0M4t$0V=v*qzVk{sEoO=X<`N?>XP|Ip?R7fkAs}fuJA&0HB5P zLi($ixe1N$Re3yyld2-kOJ0FQ0ANSqCe$oC5C>I7HKM=gaR5iUdr~EU5$?Y306=y2 zwzW`o06<*}g>*l2Rc&T)FwWFN@0L89k>msHhg2b-QPV`nkg1CL+>F#6+jXbI_x_+3 z1B@~`M-=7x@vr1XdGq^Ob)}QU@#M!1Y=250bg_#*$$+3#OTICVVb0#>x#hlc7jI0u za-_Sk42I4acEmbuMNvGkt=OD$Pj}cBr7@GY1{^_aM4P&$t>7$RCCw!D56pmWdZ72# z@QUigHpGt-V9qGqu;s$gUs4}%!n{6-)sDXOo9PAj{I*V!9g?lHwL$G+8 z1P?N(aGE43Alv#XTKtr3?vj!n=E}zMK1wl)VEFm)aZ$jNklwN(vn0C~Hg^c8th8gB z1znuQ6AA2L==4h|CZS&HQ=%;ia25zHj85L6EMmSk{@c0Ldr+{aU8fbp4ip#Y+m<)E zh+BMAN~^xBK2~ocvlbEbGO8(lrFJ{4iw;53n&r;W;mVlRza98$16Jd(O7p`lI}P4A z$l~E{vG`#D>KsxO-_6b+_4K~7K>Kpy3u=iSw=YH2>NJ!;Jo$ZP>-hgh%wO;ENq)#3F@OprM^j&%nakJg#seuFZwF`Z&IEB=kY>-J6eC0&`*1cSl6h znJTpW5I6{7KO7L7Q0SiX)yp$mzd5O{!h6{qRIKEb^YPT85S*|yJTyvY zrn#1+iOn*2F}Ir>c*R>iAoFL6y}?i?q>}!?+;M|>biQk(V42WCwqd-&G;#YxymG>O z(n9^&Ep8H-+dfg-dPv=JNR76lqkwa?I|aS6d7 z#q)gpUF$kA7ELoU%DEq0pGamgpa@9*kvNMli7{ryJg`XH0Oyj3dahTcNoyZ825o%lZS`K0xq_MZ6vH zFX^{jE?`O#f~O~<#rkQXNYGDHbJ9%oVoiSIRcn!jqzYX1;>OO2(B^b|Nz?DTR$zWi+QFW=yBew)63w?P^7XH7CuOE! z)r4pGc9+-2Hee;SqkPYz|Lw>r7-HZ9)hVKl*!{_#H9K`b>_s~E8$Z#eZN*Hf#x= - \ No newline at end of file + + diff --git a/templates/project/res/mipmap-mdpi-v26/ic_launcher.xml b/templates/project/res/mipmap-mdpi-v26/ic_launcher.xml index be316184..cf79c3d7 100644 --- a/templates/project/res/mipmap-mdpi-v26/ic_launcher.xml +++ b/templates/project/res/mipmap-mdpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ - \ No newline at end of file + + diff --git a/templates/project/res/mipmap-mdpi-v26/ic_launcher_monochrome.png b/templates/project/res/mipmap-mdpi-v26/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..30ab26a8e84b87615761f6d9a1d374ca9b264f1f GIT binary patch literal 916 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz1|<8_!p{OJ&H|6fVg?3oVGw3ym^DWND9BhG zNzcbbL8V0?EBvRo~Se7&F{muHs6HR zCjyN}0}Yn1%iit_`mJQ+ePe6yE7mu8*ToLq(+ky)sQs<=Ms-EqhF{x6)NY^9PsmQ3 z#k>Q+AY&DESyZq>l_WbUnk zb^jfuKgU*Pp4x46OsD7Z{Arx46=NO1;PQRq0Fr z>|JA8Jon93^%e6b=~!R(S=v5%+3v7StG7?Gbv<9i{=_LaHGKUO)k9v!DZaMZKX*=( zH4)E$sxI}{v2Km#dpAED=5NPe@P88S`4?^Zk>|#?gfpG5xLK3aW+tlEe<@t1|K?V@ z?{&?16PBBc(lp+_jpVMLZnaOU!tFD?|dKrSaO4k)ZgQ)-d}l9etO*z>x8h( zeA_*>5jPW4Z^T<>*&Z(9f4}X6jPvb-ADta5H=o;(@#T3}^Xx;#Jby3!a6TWKUvW25 zOY`mVRofQ)wQCbIdako`{?fEHDd~Hj{r301`Tg;)YhB-`LF{_L#C4*z;S zqtx@hw&v34Ow-MOJ#}j&7yZw;saQ}Sr@JOG)2k;dK7=`nBcg~S+Zo84CD;7=7U%!OM+Wgp&iTA&kT3hsoUUD~GFqNmv6g);aQUT=L=4AHVc{WZpjtFv>A3tm#}^*sExiqmcG%5A!u2(c3`>*0d+(p79fv n|0~zC(buOPEfE8`2VVbTx0;z5b|iJ<5s<8>tDnm{r-UW|ci5#z literal 0 HcmV?d00001 diff --git a/templates/project/res/mipmap-xhdpi-v26/ic_launcher.xml b/templates/project/res/mipmap-xhdpi-v26/ic_launcher.xml index be316184..cf79c3d7 100644 --- a/templates/project/res/mipmap-xhdpi-v26/ic_launcher.xml +++ b/templates/project/res/mipmap-xhdpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ - \ No newline at end of file + + diff --git a/templates/project/res/mipmap-xhdpi-v26/ic_launcher_monochrome.png b/templates/project/res/mipmap-xhdpi-v26/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..0130c55580fc57b7825d309bb0e1cb4a1bf7844c GIT binary patch literal 1829 zcmb7F`#T#57ER(ks48SU57oDN9 zjfzB-6|bZ_ByFl#i6Bg9yEJJCn}W64)F>WMxG9{_+{ zskQ=r0y-rwgjWJT2Cegl-Mrw+`c!aVhJH!^)`n8ys;yC$-i-PFqZiB&}$TZ>;1KS z8F^F(R%6rPU+fzH$OJ*d24Lzj8t}5NRa(b~UrCuUTy>M|YK(?IQ`Sx`IZ(0RzuHt# zK{!e4D3Kev?XKgJty*|dv*|c9BYyfFz^Wq^R306V#2!MLOSBLtZ!YtUU?v}760OUv;L*olcEyexIy>=&g&?sgOohLkOJx-sxFm{=M4 z;UW#&3)Nsm#PRhJ011}tYE{;2Fp?W!mTSV8*J$v~v z?hss35FtE-?f=kpFqxE$6(gLOY~vG2rz*`NPHDV6E>>1C3C9Ycoo%CT9#$=^ihq=7 z|uaBQ!bQN&9N#g zjjdYEZSxDu1(5LV4=fj*hSBU6XqeR9J~t}?UN{roX%HbxA|rC8wy^J@b?ocCy}MB9 zJB$@2!+bF%rl)Tq$vrP3BU02?!WThrd72qTrT-MZL zM?5=Ek97E$IDxv-V#4V=Xn7+sMO{;k@%~MP!HMb%u%0dM<+2N+!3q8zp%FW^i;zP) z_0gmw50b={2Wa`M!xbi~^@bse?X%k$RC@LO|K+^p@u3Oc5;6mkr%%E=vD?>g4b3wh z)Bi0Lh#f>3qyJjJxFVTn_qNjj{bw^tIWag0#be?SogK_=L$xoxqRR!bQ+W~-q&t} zL5ir~V%hqOJn6YRwf}Q|5kiwrcNZ1CD#Ecat+c$HW_dz0FY(S?5~tE*e+qrMVCO$M z`~}f}2l15D>#rQpATe40iNzcQ|1*X@vWF;BTGO+h?gF?@?yqO#>}P)^T=;U>X*N`d zICSB>nEy?_Hd}btx0oFy^{qI~Ac(q$d-?`-NN(+Yba#ViQQ2ysr&Hg!Pa@!{S#!mJ zlv-NFj!`CjrSXl*6GgP4C&F8818)3CI6EoQwFtj_+xd3H)tAJo_j*K~^%qzm5 zq_7c}+!hbNpY+B1@rnV%E?sHbgXJ{)w{?*Igd--v>?zcZX-i>8;@VQ_ObyxCOgI4P zfBRtd7r=0ASpVGSg+;FVf67N!047Wh0 zI+7ARMU>{3X6#@%yf7rz9T%fR8YbvQa=t{ptJvrU9?xH~rEU>4sl+R=N!Tb-lnE~f z(ZL`g@v#=&CZ2?hnG9Q@1{8mGU6xNWeLr$$ic#9yFG6b zP9+4TOGj`HZ>#p|y^Ff-sNSa&#$xGW`qi$6(E)AJH24zXtOQypm5@HBKimHbC>w&f z@*F=c1zCjKVN(rJ?G_PYx>nnndwQ}NPalmVfAL$W>}{`|eXhohWm+_IJ}(FQhxifC Hqe}h+$?$z_ literal 0 HcmV?d00001 diff --git a/templates/project/res/mipmap-xxhdpi-v26/ic_launcher.xml b/templates/project/res/mipmap-xxhdpi-v26/ic_launcher.xml index be316184..cf79c3d7 100644 --- a/templates/project/res/mipmap-xxhdpi-v26/ic_launcher.xml +++ b/templates/project/res/mipmap-xxhdpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ - \ No newline at end of file + + diff --git a/templates/project/res/mipmap-xxhdpi-v26/ic_launcher_monochrome.png b/templates/project/res/mipmap-xxhdpi-v26/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..194cc2c35a7875c495e3c1fcba260edebd0eb723 GIT binary patch literal 2911 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 literal 0 HcmV?d00001 diff --git a/templates/project/res/mipmap-xxxhdpi-v26/ic_launcher.xml b/templates/project/res/mipmap-xxxhdpi-v26/ic_launcher.xml index be316184..cf79c3d7 100644 --- a/templates/project/res/mipmap-xxxhdpi-v26/ic_launcher.xml +++ b/templates/project/res/mipmap-xxxhdpi-v26/ic_launcher.xml @@ -2,4 +2,5 @@ - \ No newline at end of file + + diff --git a/templates/project/res/mipmap-xxxhdpi-v26/ic_launcher_monochrome.png b/templates/project/res/mipmap-xxxhdpi-v26/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..1e3a4b4e77e1afe59b109a792312031985094605 GIT binary patch literal 4025 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 j4ElfLClT1iTpv%h(WkN@OYCOz;il{^I9b