From f04100816fbfd5203f49dbfae269ef2424aaf1e3 Mon Sep 17 00:00:00 2001 From: ukanth Date: Wed, 24 Jul 2019 22:38:01 +0530 Subject: [PATCH] more fixes --- .idea/caches/build_file_checksums.ser | Bin 535 -> 535 bytes .idea/caches/gradle_models.ser | Bin 154792 -> 154791 bytes Changelog.md | 3 +- app/build.gradle | 2 +- .../dev/ukanth/iconmgr/IconPackManager.java | 111 ++++++------ .../java/dev/ukanth/iconmgr/IconPackUtil.java | 36 +++- .../ukanth/iconmgr/IconPreviewActivity.java | 44 ++--- .../ukanth/iconmgr/IconSearchActivity.java | 162 ++++++++++++++++-- .../ukanth/iconmgr/util/LauncherHelper.java | 4 +- 9 files changed, 266 insertions(+), 96 deletions(-) diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 61f86487476a6eb27a2c88883cb28af0616bd9b3..7373d538ea6b713e4032aaf5b8152c0c3d7c2c8a 100644 GIT binary patch delta 34 qcmbQvGM#0@bk-cjxn;Q<=VUPoddKbj)i>Qx>R!rEzek!I0xAIWq7M-O delta 34 scmV+-0NwwW1eXMmmj!G6iL4v3oN56PeBPow!YpPAa+UV|-Merscn4n)AOHXW diff --git a/.idea/caches/gradle_models.ser b/.idea/caches/gradle_models.ser index 2b28c59bc70eb81ba0c1d872fb177662d1bbb8f3..cbb1c1c46edc714b71fa4711a1f7f7b9d4402805 100644 GIT binary patch literal 154791 zcmeFadAuY=mG@n@?%M1-r~`;0Pq3H(HMrm@rx9Hla%G=!+9UV6Y z+z~-s5f$7~AHjV=8TVzzeHj&W6dfHITxWDfeSZ;|k(rg5bx#wS^*sN)_%ZudWW+fU zCnCOiA~TkE{W>!}=w~+R-F8mx82xV3$l2X)YmjRirkY#mt47Pr_4?gwOx?~6mOFZ` zvyjtOeX)su*Wq8&*y`Nf(lyN1AmjX(&1SNjGl#dA&s%D?jIC3)I0Pq)pF$|5NuLb@kUK zGue%q{aRhs*r@7ux4$W~%3kc7gT-#k*xNhjTqYrNz@9l=55fPlc4kuTv5Z`h#Ar@2 zhio>*Z3a`E&#f*Da@lgvyf*VJX3qn-nLP6x=9s6Yb{6v6?LKORS%}4*iDr9uKXdlJ zWw^~MGPl-g4S{?zJK(>m$;<&eGRL%+FCReTcKp9(UZM7zsNC&nADc6Ww3pq)Zp*MU zwarkScNk6J_VOjW&3+$w8f;NJP0JkETUC9R zx`6g~c)-Btp;wq{2V#zDFQZ__l5THosk^)V;cOks@3QW)eR*J;?M;TAIfEC!*|E)5 zt9ebn+cP_AubDUZ+Gf9_ww#Er5nP*z#L#zOdwE;8Yp-wix2pD{ojJ(KRkNGl*ld}I zaAbRVyV-(9({L+7mR%X3pQXcKzlJ><`}X*^N15;Q-!co825M z=G6RKHXL-|PydDb-+iPBdCfDqCc4YQPdsPSK z_Fk)LZ_4b~US_mehaR;fv#JeNX??Z7youGRYc|%fc^$7+d-f$g8&c4CPZ{bk8iT0W zcUwpxA}ar2C`9X6*HQ-qr+pmdv=7eLb=?+g7!c|-B#vXJi!l2g<}>;-Mt!#!+_b#E z@c6v%v9RN~x^>-l4>fX`+D9L8qaqjUO-o&B+3UI;tGQrjiYt@=MfbZ864+`JeHb}J z=UKnpQBhwTP1RlkgXsdiP_9gocH#B8bH6d~ZK< zI(nq%m8{T1x#fK9Wcagxa-zNdsUP8?=Vay9#NI4TIhD+5eS;<4uEo-+U+Hq zp`W>HCv7+3FSOvM85_HOPh>VTab;!>Pcn3I<|rP1W#IXHiN>C(aB!C30y;NxJX7wC zmw)vsw;wWC-O3`<%=eqHGu3>%V*~!UxSXFK7`yVlmTFs2i>HC(lK z9%E<9kM6mW=eFff7d*;}^;{uW;-Yd(OrU~1Wgo?3$0M)DN7wRruucs z0d$0&El&kn6r39FO*u{!*svQ39aErlvhL3xrQ*h;aOs8tT#Sux+l; z!@ZpPHkjSP9=+>LZE0bFwW}eM?8xAObYZ9I-{v7(nsD%zH*{EhgZr@C7@Yb8z2EHF ze&kKey$#-CPlfhobGO;r!Jbh&n!U9xbZu7>I>}HcTd5%M4IFy-C0R9;b?(ls?ZJQ0 z@xbVIHW}NOEFZ*2x0jKAu+%pDsEdUqwQn%@$iV=wM$e0Fsk+GqF>WYV|e`}kpe3S`u&i!BQcS^GBdTyT;_$&UzwTN?d2&CK8W6y@&5v-rVZ9q*u8U+gX1{V_#o1Ekp?Gi zX!q=8Xntz-h!^bm!O#DN!=yKH->q+cty5o<6ER(SXk4{I?E0|&6 z;tsd&#|(Gvs1W1`?K~O|L?WDHFy=0@wS7@#oh_Ww=?lNS?D?M#wH>D|;YoABqkPf~ z`nq^vU4{zg;L5A04`*z{itTqePs@d=XyLBRih9mZL(esx=Kp&osniQ2&5A|2C?$Kb zF5xRevwCtGg4eq5f!uDD+uL?p8Q$Z$Jn@>~sOG&fjePV2Ws7OtsWiI2xw4WisT4#o z#ILKE@}$xz1`d#XMHjvJ`VZiJ)c!k{I!)VsI51jVeAW67-!rQE)=HF`J$LpIOY4$} zr+IX4A_WwP#w$IU?Md{kPimS7bG9auI2tyqycRX8nVyqKGl7?6wM=nE29TaT@{sO0 zC4N7T0ZOu}j*#Tysq?P;{iv!qOQI^cdrmtsGPUfArb%(8biOG{j8C$>tw}n_GwQ*D%JVRO?fdcueq%d%ve3thK0rK@3>HdwsO+BZ}O@G#dZ+q5H zd#ozXWtVjrYR~rZ4i7Inyub^3nFrtY!V^Xep`8KBMOQxS@h7nq&*Wk+o4 z%&99RAAYOvek!OOS$cA)5oY=Ci%z@ucY9bH-NJufeD8Z-Q4U4)-YLs?0j~8ggTFK$ zPi#m5%~6?#6;wg7blmcj)&a>>nMZQSKoPFWcw#}BYe&A8-aim+RI`0~mo`Q~K8YMC>9k^_Y zA!8FPZD*1iGH#x*MFbZzpF_B?(VUoK_eTL@jfC6B^$}!{u15+9GDLGSyiY8UuFN3_ z^fP4{XUm_4a8PI(0=%f9sWJ>MY>FKw28ns1ZV+N_QTJ{)b_Hf>p2(-OVp5PFY-gUh zf*<8i^o0+`rwBQ3-kljeOPGZon3xKULsKSK_V9+HLOSMhIumUDyrCo$H}eU*m!ajx zmHTl>gj<_1gSd|wLYP;}GPG@}gW0vN9Zp&y%G&+{PsKZhGhOHkKD}doU){szOkqym zO4E8nk=?1ZC=6yhyJlxIp;=B~dOy&c+rno`oZY|k$$uJtp*YpXgjtr1zhbwGM~M#GLg?(hj;p%#axg*(n_3)iHWxyp*w z5i@k0`5usWc;@JrzsAmFm4;IsJ{4->)wuJx%+Y^&HtrN_J-jdV=C}@)dcAJn&asY} z>+@>Mxd6NHa(uD%YjWMA7`Vh&i(lUGtRuDpMXae<&n8>j?(`n48^H9Q%Q3s%$tNhy zX0tOh9O4xE8*f{yh}lNOJWwpj7&*TyI1Q9Z56Z0W;(^2WFP*K_`{ zj;NbN)PCj=_WW}upkBPx*3AC(@4DsK{a^Xui`@CA`+o>i&PtdATHw9u;%xS79~$+r zk$DEQ9x)zY$B{f9Ux&*chp)3wf~D;|7GFnXITc@r3mfI@pbJgBYEjGV2yieHU{~oD2>^k5o+BWJ{)6SOXN8w23Fpc1*bLqY&N#Jyz7L_jp|{ zvxg@jTh0}|MVZHQF2_&oWlImP`_R$%ocY!_{D@;3#be8AyytIV?ykSgCO5Rq=9>S! z;A;CO^I(5m(}bq}BB%`&~8vywK${${Ot)MV#T1`B0){hlu$dj3U~JFq%%6DHxg5> z0e4$4CO*%E8Y?>9MdmVQ|EnCRFxT+xV)%#KF(EqGlG#9j1#QI&y*=H&SPqGfafRY) z4bH}Q+V`Cg@7anqtS-{|R66Ko7IJ1hV0!0CLt|9Yi1T~~MvhI7XG-~;Ah=Ab^S+E5 z>>bYQ+u%YW9)1TCzm}KF|L6|mJ5%TV@A^CjOFhAt88IvGD<#||UV&AVSkAKlkd1e+ zwJ2-|gXNqUkD51XtT(kpy4N;#yD4q38L=Y8E)S{5At_ z_#U4@-t35AJ5wLkL&K|SLdwuHnJg2FBn@ZjB5R_haC^a<{GpfoJdXecY`}$BUvT^sw|_IXPk>@IMbI@sln0QrbKZfGmE z5^#pv8=Gd!-~usBg$ZLNVQIHFj@jnE<#1PrGXtU_U;&Za&{#G@Yw-dw4p+6G2(=6~ z{(u|xg<1<02}>EA#h=cA$zLpi6~UJ**}Wy_H54)wzrzskV>phdsdK8_&T*jfcNB@mmL9wH&Auv>srQEg)&*bwj93;3$u8 z4u%#m!|`E^z;ch^T2nhy+1DZmlc7FQTdus2est$xRJ5Ti0EGN{p={@d-Xh+TthB1L z#g>s3^Wj9$j5kVNgLNu4U>dXz)Hk{+2F^=8ku}~2U^N(l(M&Y+VGDtG{8dKL(}^Z% zXU^Ow1G(9S;$Ujz7B8FlVloGAPJV$hzHX59FGLxBG@|3X7>kMQJoSoSeCQBR>uBGJ zgIl@FG}t0~l>57_@9encho>ILoHsG5=dPZ6|0C;PaLcV9`e1pItpVM00G?2XxEo<) z_S%_a@ciZNia$+VT(kDhjfe;8^+ONT9<`Bxv*0t2<)vo7Z5mDNK{3d)oa@drIG}-f zbxsS#8ni$-tFtFJ?M3#lp4ZtLelhyl_r4dbmjJjYqs|L@5YrUK5MaTAv5Xp9iwH~u zMd5hxeNe${8Lo(gmgNHel1@wXP7YV6KL6Hu@&EF;zCW?wqwp5|%r3hg8N7w?>#AtC zWR5n_dZF6)#uI2RY(=tgl2+R9!6~&+7~=v$G+&SEZEP{z%yHYb5;Ft{;h2r}3-0=1 zxg~ll>#1yg{JJhY!e)oH9Xr$5ryhx}xJBJb_HiBOrEy z7_8xolMCl!tuuF{{~J}Zub>ZW9_=Z!jWOKCi=L$r#u3iP8?Jd^uk-uerJfgw84#Ow z_(NL+1m4>3=QOR$@4o$Mn06N^7D|42Ovy1cL_x)p?7{;#KloZ`p7^Qg^|uc7dUyMe zJlo<3-MQ`biTPsQVykTDi#dh$Wv?B%)?s%*+Ab*HE}qRL6(UseOGhhcTO}FY7In zxp>%0XN{7>{{nT2LS~Qs*Q=iX92DJ&0vSie%V2R&fE&qW-0|v{ZXB}EOCGI-;*~JN zu|0pdl6)lA#H^~NN~L0!idEQ3v1(NfRx=uEvDDBtT?~lld8&|MYPUS|y(rWZ zhVZS? z77K=^6w6x4tXI^URn`o>rWxhB(Xbk8% z>$9RByKeQ5PebpCNx%S+eLTCIz%Ea?=%N2$6!VR8*P}HG3KQu*F^WYuGL2fvs+3AK zwNNO+Rz|U0Dm9FXr4{OWQEwOxU9A?3dOk)*e0TceslR#+Otv;ABX~xzZ)bS7Zlei_ zKj$&J>@L~!oY;MIv_h^J?r7`Z`?Qb4#Tb)LDhpN869Q$mV}VOtxYt74lG5eexJ8cr_^$5Vgo^2dE?$Z$74 zTEh(s#|CA{Co-4k;`3HrubJqa#YRafXlAiw6lzuUW2LC6mRZ$Qz}_rc1uxw^PZu)8 zFJJSa3<`4curALK^J=ddZ;Z`b-u!zzbAZSci^x0Z25tm)*?9VulP?~!z)dMxfGKmW zU^X<(s;Nr7tQE9!Ln*5YdZ1Ek=#2&*b`4c+Xo^-U`Bp&MSWDdZy@RiZC06U#<=O)i zpV3sohBb?}-P2o5e8pZ<#w*^KhugPaxa(b*&FM#kq{E_;xNY$E%9V2FhO<`>8R(Wr zYoMr#yq|}>t0u1l-c_p#U}?I}Y*SK-hFU6_X0=vOYl>2@>pI94NIUPQ4K_6j`d(OlsQWgQJkBCd{nr51(f8EK?J#EM^!{ecS z^o+t8%rpIYt{`7j>t;b!OLetq78PA9HPBb^yfa{tvW{-mC@Y4F&VwXywNR#zC5)M; zU5BzLtmAa`-k@vQ*qqX|?Pd0oX-(kIGWerl=Q!-j6h`$UgVSDxX5&YO#G~RRy7t*W zAnoNpf68G)R=VTSHlKJ^*tkxV15L=we7;gC)r?vh_A0=9MayX5x6#n*YPC`{OIop7 zD8i3a1L@I>y!4&{{XF|)vDI+=`Ccr-3&I$M4U^z(xV0U5LpVG-!f~aMT{O@{<_@L|wc7(i&`hiI=%zOsINeLYDB@yN){;44HA_IKCkJ)W$0}`-H!} zws(gZM(tRs8^ERN4EUZ~LnEnLRjpTzLbYIOx}__BbH$lOBKbeve!DyRKlx- z6}&+j+b;|x59~u3!lkSQu0gL6FNVCnENs4g3>yC*6$!0v;-~x~3b!zZ!sT5+h<@hn zX5xG~L?sUInUYc^_T86yy~0VAb4B^oag>iY7ko*#y|x0I;=3)oqI6e}Lub!LdCuNz z54E1F#-fcsA%=8io1dP2>;m}aY$s>2cQN>UXyn>>t;RMQoX5-AR(D~5F&*9w6mpGR zHCH${gt`|US@|>EB^Cvuj_0TxEeZzBcHvaI!e0E=(_SNtEJH$!_%WiuQ(jjq1+~%8 zta8;%an}Fqp#|3b#P{IvjkAaqv>2Zdr8<{0h}ltqe343=I5g zV0BTi>y;u;HSea%rNKnf7O69l(m2$rWiU@Ez-NOP%yS&_i)dOhOeA%Wg^8qAkBN6Y z=G@hyd@@WVHI0FZq|Q{CNNbB@;+xygI2j;2gMn-T-`FEe{~MLbK^kp>U|dMvT~Zs{mQ1N_lGkF|{J!K!o3Sx4pORKt<%rlOjv2|rR-@vcoR zRy3nlDXV%ztKp(6vA*RSA1yKWv0wlnw*|g4z+QQLV5sUKVnZp^%wkc+M+ObwON~-Z zDXGiy)g zU%{-b{dGTL7<%nX>Zd1xUcstXD<#FOD`iF1$_f}*tQggbX&UvKUIt&HUsmMaC%SXe z+^SS)Vg^B>tQ2%rF_c0uZJNjpp4P1(0<()DP;=Wid@7V)$ zW?;3vVrV*i*K%1mO<)r&_4p`>Uv#lq?VVS6@78Lt)7c&SL5CUtaD z8WW?FQZP<*lDfx&PExCf&MP+T_e;@}WY9@!8Us2>ovEUe))t4(mwx->p8?*6R-lOK zH#k6v&EoH`>@oiK()%C5a^O(pu-Ev+*Bt!?QGYTdENTTd6~9ui)rwZBXsVc5UA8b> z#`lbdY2eVIsMq)g84{`?uQ60E;W-)@AnT>NW|S~75VIv4mK|j@G%-n9DRoRz8WUrZQZP=DZgOo!~(i#_+`$)<2U#Gm>&Kx}=Q5cdRed@=4 zBr7)%C}lJO)-O=CbLsWVkX(%Rw>xhnV04M1eOZAuX|+bZT+|g^E!5Qp*83?|912tU^b#nOhd+F1#?n+% zfnrRxDP!qwqgpLg)p7&hVX$u1z$EUP6~LcTN)vgcEmB7wr7Ak3USW9z@jmy*&;Aw5T|GLK z!@#@Z?A6Zhu#yAhTEnz3cLkr94a2}XK75ie%k?@II5)5`wHiA>er2k@Us>?3geimt z-Ow>GuA5ct5}_IvHq@{z9Xm)Ex(-heE3Va=@9ve;#2smg)Nw~?OpH59!8mb8>K+U3 zNUa|3Ucc!;XLl>f$u*>=G2o8WnJVsRZE?8Ue99$9kHTF~ZDE~=KKLj0X#@*tqnk4bug&VKd>`=jmvyCzA$M6VV-jRUK$;jNt&%zh zDUFFSNGTX621(sx!62#C!(ijk#y^WrB!fXx(-<&F>P!`bw6-`5{`J~5)4*WtBpCrV zwnM@EQgZ|a`#(DV1DGTeiX4XE%b$L$w{lVjf~sPw4Qx?^i7_VJKD}P4!_%r_mWozU z>RRk@HhcZVkJqbqA3Lc5R+xpy3)XUmuginT56@JU`ceTs;by%(qo`ȫ| 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 Ie)UiM4=T6cga7~l literal 154792 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 diff --git a/Changelog.md b/Changelog.md index 50602e0..eda9f5f 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,10 +1,11 @@ Version 3.0 +* Feature: Search icons inside iconpacks * Feature: Posidon Launcher support * Bug: App Icon size issue on main list * Bug: Exclude other icon managers on main list * Bug: Masked icon preview always shows as empty (whitecons etc.,) -* +* Crash report Fixes and various performance improvements Version 1.3 diff --git a/app/build.gradle b/app/build.gradle index 1f4627a..11aa1c7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ android { defaultConfig { applicationId "dev.ukanth.iconmanager" minSdkVersion 19 - targetSdkVersion 28 + targetSdkVersion 27 versionCode 3000 versionName "3.0.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/dev/ukanth/iconmgr/IconPackManager.java b/app/src/main/java/dev/ukanth/iconmgr/IconPackManager.java index 89ee077..d0a5786 100644 --- a/app/src/main/java/dev/ukanth/iconmgr/IconPackManager.java +++ b/app/src/main/java/dev/ukanth/iconmgr/IconPackManager.java @@ -62,10 +62,10 @@ public List updateIconPacks(IPObjDao ipObjDao, boolean forceReload, Mater packageList.add(info.packageName); } } - List rinfo = pm.queryIntentActivities(new Intent("com.gau.go.launcherex.theme"), PackageManager.GET_META_DATA); - rinfo.addAll(pm.queryIntentActivities(new Intent("com.novalauncher.THEME"), PackageManager.GET_META_DATA)); - rinfo.addAll(pm.queryIntentActivities(new Intent("org.adw.launcher.THEMES"), PackageManager.GET_META_DATA)); - + List rinfo = new ArrayList<>(); + for (String intent : IconPackUtil.ICON_INTENTS) { + rinfo.addAll(pm.queryIntentActivities(new Intent(intent), PackageManager.GET_META_DATA)); + } loadIconPack(rinfo, ipObjDao, installedIconPacks); return installedIconPacks; } @@ -75,12 +75,16 @@ public void insertIconPack(final IPObjDao ipObjDao, final String packageName) { final PackageManager pm = mContext.getPackageManager(); final IconPackUtil ip = new IconPackUtil(); //detect if it's iconpack or not - List rinfo = pm.queryIntentActivities(new Intent("com.gau.go.launcherex.theme"), PackageManager.GET_META_DATA); + List rinfo = new ArrayList<>(); + for (String intent : IconPackUtil.ICON_INTENTS) { + rinfo.addAll(pm.queryIntentActivities(new Intent(intent), PackageManager.GET_META_DATA)); + } + /*List rinfo = pm.queryIntentActivities(new Intent("com.gau.go.launcherex.theme"), PackageManager.GET_META_DATA); rinfo.addAll(pm.queryIntentActivities(new Intent("com.novalauncher.THEME"), PackageManager.GET_META_DATA)); rinfo.addAll(pm.queryIntentActivities(new Intent("org.adw.launcher.THEMES"), PackageManager.GET_META_DATA)); rinfo.addAll(pm.queryIntentActivities(new Intent("com.teslacoilsw.launcher.THEME"), PackageManager.GET_META_DATA)); rinfo.addAll(pm.queryIntentActivities(new Intent("com.anddoes.launcher.THEME"), PackageManager.GET_META_DATA)); - rinfo.addAll(pm.queryIntentActivities(new Intent("com.fede.launcher.THEME_ICONPACK"), PackageManager.GET_META_DATA)); + rinfo.addAll(pm.queryIntentActivities(new Intent("com.fede.launcher.THEME_ICONPACK"), PackageManager.GET_META_DATA));*/ List excludedPackage = Util.getExcludedPackages(); for (ResolveInfo ri : rinfo) { if (ri.activityInfo.packageName.equals(packageName) && !excludePackages.contains(packageName)) { @@ -108,53 +112,6 @@ public void insertIconPack(final IPObjDao ipObjDao, final String packageName) { } } - class ProcessPack implements Callable { - String pkgName; - IPObjDao ipObjDao; - boolean onlyMissed = false; - - public ProcessPack(String pkgName, IPObjDao ipObjDao, boolean onlyMissed) { - this.pkgName = pkgName; - this.ipObjDao = ipObjDao; - this.onlyMissed = onlyMissed; - } - - @Override - public IPObj call() throws Exception { - IPObj obj = new IPObj(); - IconPackUtil ip = new IconPackUtil(); - IconAttr attr = new IconAttr(); - if (!onlyMissed) { - obj.setIconPkg(pkgName); - PackageManager pm = mContext.getPackageManager(); - ApplicationInfo ai = pm.getApplicationInfo(obj.getIconPkg(), PackageManager.GET_META_DATA); - obj.setIconType("GO"); - obj.setInstallTime(pm.getPackageInfo(obj.getIconPkg(), 0).lastUpdateTime); - obj.setIconName(mContext.getPackageManager().getApplicationLabel(ai).toString()); - obj.setTotal(ip.calcTotal(obj.getIconPkg())); - attr.setDeleted(false); - obj.setMissed(ip.getMissingApps(obj.getIconPkg(), Util.getInstalledApps()).size()); - attr.setSize(Util.getApkSize(obj.getIconPkg())); - obj.setAdditional(attr.toString()); - ipObjDao.insert(obj); - sendIntent(pkgName); - } else { - IPObj obj2 = ipObjDao.queryBuilder().where(IPObjDao.Properties.IconPkg.eq(pkgName)).unique(); - if (obj2.getMissed() == 0 || obj2.getAdditional() == null) { - attr.setDeleted(false); - obj2.setMissed(ip.getMissingApps(obj2.getIconPkg(), Util.getInstalledApps()).size()); - attr.setSize(Util.getApkSize(obj2.getIconPkg())); - obj2.setAdditional(attr.toString()); - ipObjDao.update(obj2); - } - sendIntent(pkgName); - obj = obj2; - } - return obj; - } - - } - private void sendIntent(String pkgName) { Intent intentNotify = new Intent(); intentNotify.setAction("insertlist"); @@ -162,7 +119,6 @@ private void sendIntent(String pkgName) { mContext.sendBroadcast(intentNotify); } - private void loadIconPack(List rinfo, final IPObjDao ipObjDao, final List installedIconPacks) { ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2); @@ -202,4 +158,51 @@ private void loadIconPack(List rinfo, final IPObjDao ipObjDao, fina Thread.currentThread().interrupt(); } } + + class ProcessPack implements Callable { + String pkgName; + IPObjDao ipObjDao; + boolean onlyMissed = false; + + public ProcessPack(String pkgName, IPObjDao ipObjDao, boolean onlyMissed) { + this.pkgName = pkgName; + this.ipObjDao = ipObjDao; + this.onlyMissed = onlyMissed; + } + + @Override + public IPObj call() throws Exception { + IPObj obj = new IPObj(); + IconPackUtil ip = new IconPackUtil(); + IconAttr attr = new IconAttr(); + if (!onlyMissed) { + obj.setIconPkg(pkgName); + PackageManager pm = mContext.getPackageManager(); + ApplicationInfo ai = pm.getApplicationInfo(obj.getIconPkg(), PackageManager.GET_META_DATA); + obj.setIconType("GO"); + obj.setInstallTime(pm.getPackageInfo(obj.getIconPkg(), 0).lastUpdateTime); + obj.setIconName(mContext.getPackageManager().getApplicationLabel(ai).toString()); + obj.setTotal(ip.calcTotal(obj.getIconPkg())); + attr.setDeleted(false); + obj.setMissed(ip.getMissingApps(obj.getIconPkg(), Util.getInstalledApps()).size()); + attr.setSize(Util.getApkSize(obj.getIconPkg())); + obj.setAdditional(attr.toString()); + ipObjDao.insert(obj); + sendIntent(pkgName); + } else { + IPObj obj2 = ipObjDao.queryBuilder().where(IPObjDao.Properties.IconPkg.eq(pkgName)).unique(); + if (obj2.getMissed() == 0 || obj2.getAdditional() == null) { + attr.setDeleted(false); + obj2.setMissed(ip.getMissingApps(obj2.getIconPkg(), Util.getInstalledApps()).size()); + attr.setSize(Util.getApkSize(obj2.getIconPkg())); + obj2.setAdditional(attr.toString()); + ipObjDao.update(obj2); + } + sendIntent(pkgName); + obj = obj2; + } + return obj; + } + + } } diff --git a/app/src/main/java/dev/ukanth/iconmgr/IconPackUtil.java b/app/src/main/java/dev/ukanth/iconmgr/IconPackUtil.java index 724f7d3..05dd697 100644 --- a/app/src/main/java/dev/ukanth/iconmgr/IconPackUtil.java +++ b/app/src/main/java/dev/ukanth/iconmgr/IconPackUtil.java @@ -42,6 +42,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; +import dev.ukanth.iconmgr.dao.IPObj; import dev.ukanth.iconmgr.util.Util; /** @@ -52,6 +53,17 @@ public class IconPackUtil { private static final String TAG = "MicoPacks"; private Resources iconPackres = null; + + public final static String[] ICON_INTENTS = new String[] { + "com.fede.launcher.THEME_ICONPACK", + "com.anddoes.launcher.THEME", + "com.novalauncher.THEME", + "com.teslacoilsw.launcher.THEME", + "com.gau.go.launcherex.theme", + "org.adw.launcher.THEMES", + "org.adw.launcher.icons.ACTION_PICK_ICON" + }; + public static @ColorInt int getPaletteColorFromApp(Icon app) { return getPaletteColorFromBitmap(app.getIconBitmap()); @@ -140,7 +152,6 @@ private Bitmap loadBitmap(String drawableName, String packageName) { ByteArrayOutputStream stream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); - new Thread(() -> { Intent broadcastIntent = new Intent(); broadcastIntent.putExtra("image",byteArray); @@ -426,6 +437,27 @@ private Bitmap getMostAppropriateBackImage(Bitmap defaultBitmap, List mB } + /*public List lookUpSearch(final String searchQuery, List objList) { + try { + ExecutorService service = Executors.newFixedThreadPool(3); + List>> futures = new ArrayList>>(); + for (final IPObj attr : objList) { + Callable> callable = () -> getFilterIcons(attr.getIconPkg(), searchQuery); + futures.add(service.submit(callable)); + } + service.shutdown(); + + List outputs = new ArrayList<>(); + for (Future> future : futures) { + outputs.addAll(future.get()); + } + return outputs; + } catch (Exception e) { + e.printStackTrace(); + } + return new ArrayList(); + }*/ + public Set processXpp(final String packageName, List input) { try { ExecutorService service = Executors.newFixedThreadPool(5); @@ -436,7 +468,7 @@ public Set processXpp(final String packageName, List input) { if (isSupported(listPackages, attr.key)) { Bitmap iconBitmap = loadBitmap(attr.value, packageName); if (iconBitmap != null) { - return new Icon(attr.value, iconBitmap); + return new Icon(attr.value, packageName, iconBitmap); } } return new Icon(""); diff --git a/app/src/main/java/dev/ukanth/iconmgr/IconPreviewActivity.java b/app/src/main/java/dev/ukanth/iconmgr/IconPreviewActivity.java index 64e63de..6e426a0 100644 --- a/app/src/main/java/dev/ukanth/iconmgr/IconPreviewActivity.java +++ b/app/src/main/java/dev/ukanth/iconmgr/IconPreviewActivity.java @@ -24,6 +24,7 @@ import android.widget.GridLayout; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -33,6 +34,8 @@ import com.afollestad.materialdialogs.StackingBehavior; import com.glidebitmappool.GlideBitmapPool; +import org.w3c.dom.Text; + import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; @@ -160,9 +163,6 @@ protected void onPause() { @Override protected void onDestroy() { super.onDestroy(); - /*if (iconViewReceiver != null) { - unregisterReceiver(iconViewReceiver); - }*/ } private void saveImage(Icon icon, String packageName) { @@ -279,6 +279,7 @@ protected void onPostExecute(Boolean aBoolean) { gridLayout.removeAllViews(); + if (themed_icons != null) { List list = new ArrayList(themed_icons); if (Prefs.isNonPreview() && nonthemed_icons != null) { @@ -290,34 +291,37 @@ protected void onPostExecute(Boolean aBoolean) { for (final Icon icon : list) { if (icon.getIconBitmap() != null) { + /*RelativeLayout relativeLayout=new RelativeLayout(mContext); + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); + params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); + relativeLayout.setLayoutParams(params); + TextView textView = new TextView(mContext); + textView.setText(icon.getPackageName());*/ ImageView image = new ImageView(mContext); image.setLayoutParams(params); image.setPadding(15, 15, 15, 15); image.setScaleType(ImageView.ScaleType.FIT_CENTER); image.setImageDrawable(new BitmapDrawable(getResources(), icon.getIconBitmap())); - image.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - new MaterialDialog.Builder(mContext) - .title(icon.getTitle()) - .positiveText(R.string.save) - .onPositive((dialog, which) -> { - if (isStoragePermissionGranted()) { - saveImage(icon, packageName); - dialog.dismiss(); - } - }) - .negativeText(R.string.close) - .icon(new BitmapDrawable(getResources(), icon.getIconBitmap())) - .show(); - } - }); + image.setOnClickListener(v -> new MaterialDialog.Builder(mContext) + .title(icon.getTitle()) + .positiveText(R.string.save) + .onPositive((dialog, which) -> { + if (isStoragePermissionGranted()) { + saveImage(icon, icon.getPackageName()); + dialog.dismiss(); + } + }) + .negativeText(R.string.close) + .icon(new BitmapDrawable(getResources(), icon.getIconBitmap())) + .show()); image.setOnLongClickListener(view -> { if (isStoragePermissionGranted()) { saveImage(icon, packageName); } return true; }); + //relativeLayout.addView(image); + //relativeLayout.addView(textView); gridLayout.addView(image); } } diff --git a/app/src/main/java/dev/ukanth/iconmgr/IconSearchActivity.java b/app/src/main/java/dev/ukanth/iconmgr/IconSearchActivity.java index 673faa8..ec92947 100644 --- a/app/src/main/java/dev/ukanth/iconmgr/IconSearchActivity.java +++ b/app/src/main/java/dev/ukanth/iconmgr/IconSearchActivity.java @@ -1,11 +1,24 @@ package dev.ukanth.iconmgr; +import android.Manifest; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; +import android.os.Environment; +import android.support.v13.app.ActivityCompat; +import android.support.v4.content.LocalBroadcastManager; import android.support.v7.app.AppCompatActivity; import android.util.DisplayMetrics; +import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -13,11 +26,16 @@ import android.widget.GridLayout; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.RelativeLayout; import android.widget.SearchView; +import android.widget.TextView; +import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.glidebitmappool.GlideBitmapPool; +import java.io.File; +import java.io.FileOutputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -32,6 +50,8 @@ public class IconSearchActivity extends AppCompatActivity { + private static final int WRITE_EXTERNAL_STORAGE = 12; + private MaterialDialog plsWait; private LinearLayout.LayoutParams params; @@ -41,6 +61,9 @@ public class IconSearchActivity extends AppCompatActivity { private SearchView mSearchView; + private BroadcastReceiver uiProgressReceiver; + private IntentFilter uiFilter; + @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); @@ -54,6 +77,24 @@ public boolean onCreateOptionsMenu(Menu menu) { return true; } + private void registerUIbroadcast() { + uiFilter = new IntentFilter("UPDATEUI"); + + uiProgressReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + byte[] byteArray = intent.getByteArrayExtra("image"); + Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); + ImageView image = new ImageView(getApplicationContext()); + image.setLayoutParams(params); + image.setPadding(15, 15, 15, 15); + image.setScaleType(ImageView.ScaleType.FIT_CENTER); + image.setImageDrawable(new BitmapDrawable(getResources(), bitmap)); + gridLayout.addView(image); + } + }; + } + private void setupSearchView(MenuItem searchItem) { mSearchView.setIconifiedByDefault(false); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @@ -108,7 +149,7 @@ protected void onCreate(Bundle savedInstanceState) { objList = ipObjDao.loadAll(); - + registerUIbroadcast(); } private void searchIcons(String query) { @@ -125,11 +166,13 @@ private void searchIcons(String query) { @Override public void onResume() { super.onResume(); + LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(uiProgressReceiver, uiFilter); } @Override protected void onPause() { super.onPause(); + LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(uiProgressReceiver); } @Override @@ -137,6 +180,25 @@ protected void onDestroy() { super.onDestroy(); } + private void saveImage(Icon icon, String packageName) { + String root = Environment.getExternalStorageDirectory().toString(); + File myDir = new File(root + "/micopacks/" + packageName); + myDir.mkdirs(); + String fname = icon.getTitle() + ".png"; + File file = new File(myDir, fname); + if (file.exists()) + file.delete(); + try { + FileOutputStream out = new FileOutputStream(file); + icon.getIconBitmap().compress(Bitmap.CompressFormat.PNG, 85, out); + out.flush(); + out.close(); + Toast.makeText(getApplicationContext(), "Saved successfully: " + file.getAbsolutePath(), Toast.LENGTH_SHORT).show(); + } catch (Exception e) { + Log.e("MICO", e.getMessage(), e); + } + } + private class IconsPreviewLoader extends AsyncTask { @@ -159,8 +221,12 @@ protected Boolean doInBackground(Void... voids) { while (!isCancelled()) { try { IconPackUtil packUtil = new IconPackUtil(); - for (IPObj obj : objList) { - themed_icons.addAll(packUtil.getFilterIcons(obj.getIconPkg(), query)); + for (int i = 0; i < objList.size(); i++) { + final int pos = i; + runOnUiThread(() -> { + plsWait.setTitle(mContext.getString(R.string.searching) + (" " + pos + "/" + objList.size())); + }); + themed_icons.addAll(packUtil.getFilterIcons(objList.get(i).getIconPkg(), query)); } return true; } catch (Exception e) { @@ -170,6 +236,7 @@ protected Boolean doInBackground(Void... voids) { return false; } + @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); @@ -189,6 +256,7 @@ protected void onPostExecute(Boolean aBoolean) { gridLayout.removeAllViews(); + if (themed_icons != null) { List list = new ArrayList(themed_icons); if (list != null && list.size() > 0) { @@ -196,29 +264,36 @@ protected void onPostExecute(Boolean aBoolean) { for (final Icon icon : list) { if (icon.getIconBitmap() != null) { + /* RelativeLayout relativeLayout=new RelativeLayout(mContext); + relativeLayout.setLayoutParams(params); + TextView textView = new TextView(mContext); + textView.setText(icon.getPackageName());*/ ImageView image = new ImageView(mContext); image.setLayoutParams(params); image.setPadding(15, 15, 15, 15); image.setScaleType(ImageView.ScaleType.FIT_CENTER); image.setImageDrawable(new BitmapDrawable(getResources(), icon.getIconBitmap())); - image.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - new MaterialDialog.Builder(mContext) - .title(icon.getTitle()) - .positiveText(R.string.save) - .onPositive((dialog, which) -> { - - }) - .negativeText(R.string.close) - .icon(new BitmapDrawable(getResources(), icon.getIconBitmap())) - .show(); - } - }); + image.setOnClickListener(v -> new MaterialDialog.Builder(mContext) + .title(icon.getTitle() + "\n" +" " + getAppNameByPackage(icon.getPackageName()) + " ") + .positiveText(R.string.save) + .onPositive((dialog, which) -> { + if (isStoragePermissionGranted()) { + saveImage(icon, icon.getPackageName()); + dialog.dismiss(); + } + }) + .negativeText(R.string.close) + .icon(new BitmapDrawable(getResources(), icon.getIconBitmap())) + .show()); image.setOnLongClickListener(view -> { + if (isStoragePermissionGranted()) { + saveImage(icon, icon.getPackageName()); + } return true; }); + //relativeLayout.addView(image); + //relativeLayout.addView(textView); gridLayout.addView(image); } } @@ -229,4 +304,57 @@ public void onClick(View v) { } } } + + private boolean isStoragePermissionGranted() { + if (Build.VERSION.SDK_INT >= 23) { + if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED) { + Log.v("MICO", "Permission is granted"); + return true; + } else { + + Log.v("MICO", "Permission is revoked"); + ActivityCompat.requestPermissions(IconSearchActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_EXTERNAL_STORAGE); + return false; + } + } else { //permission is automatically granted on sdk<23 upon installation + Log.v("MICO", "Permission is granted"); + return true; + } + } + + + private String getAppNameByPackage(String packageName){ + + final PackageManager pm = getApplicationContext().getPackageManager(); + ApplicationInfo ai; + try { + ai = pm.getApplicationInfo(packageName, 0); + } catch (final PackageManager.NameNotFoundException e) { + ai = null; + } + return (String) (ai != null ? pm.getApplicationLabel(ai) : packageName); + } + @Override + public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + switch (requestCode) { + case WRITE_EXTERNAL_STORAGE: { + // If request is cancelled, the result arrays are empty. + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + // permission was granted, yay! Do the + // contacts-related task you need to do. + Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show(); + } else { + + // permission denied, boo! Disable the + // functionality that depends on this permission. + Toast.makeText(getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show(); + } + return; + } + } + } + } diff --git a/app/src/main/java/dev/ukanth/iconmgr/util/LauncherHelper.java b/app/src/main/java/dev/ukanth/iconmgr/util/LauncherHelper.java index ac4e1e0..c6694b3 100644 --- a/app/src/main/java/dev/ukanth/iconmgr/util/LauncherHelper.java +++ b/app/src/main/java/dev/ukanth/iconmgr/util/LauncherHelper.java @@ -78,7 +78,7 @@ public class LauncherHelper { public static final int POSIDON = 28; public static final int TOTAL = 29; - + public static final int ROOTLESS = 30; @@ -156,6 +156,8 @@ public static int getLauncherId(String packageName) { return POSIDON; case "com.ss.launcher2": return TOTAL; + case "amirz.rootless.nexuslauncher": + return ROOTLESS; default: return UNKNOWN; }