mirror of
				https://github.com/topjohnwu/Magisk
				synced 2025-10-30 09:00:52 +01:00 
			
		
		
		
	Compare commits
	
		
			1741 Commits
		
	
	
		
			manager-v5
			...
			manager-v7
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 5b30c77403 | ||
|   | 8248480d56 | ||
|   | 345d992d39 | ||
|   | a7f6afa4bc | ||
|   | d22c7de79a | ||
|   | 3eae9494ce | ||
|   | be7e737253 | ||
|   | b6eb912dba | ||
|   | 8049b08918 | ||
|   | d1fa5be210 | ||
|   | fdbb1af02c | ||
|   | c85a5cae88 | ||
|   | 649ef53409 | ||
|   | e784212283 | ||
|   | 66eb1078fe | ||
|   | 1c09b3642f | ||
|   | d08b1a6639 | ||
|   | 10f50e2401 | ||
|   | 8e9a7b25a1 | ||
|   | 4859ee2da9 | ||
|   | b45db44ad9 | ||
|   | e25ce63872 | ||
|   | 162eeaa0a6 | ||
|   | f36ce905aa | ||
|   | 8ac3aaf36c | ||
|   | a199b0ace1 | ||
|   | 2f2108e4e8 | ||
|   | f5f7fd9132 | ||
|   | f9ae4ab475 | ||
|   | 8de03eef3f | ||
|   | 8df942f96e | ||
|   | 9bb2243b56 | ||
|   | db06038548 | ||
|   | ecb33d3176 | ||
|   | eae1c17738 | ||
|   | ea55532e33 | ||
|   | 2a40cb60a9 | ||
|   | d371d017b7 | ||
|   | 1d9359d563 | ||
|   | 945f88105f | ||
|   | 957feca626 | ||
|   | c0447009db | ||
|   | 8893cbd64a | ||
|   | f0240b1f06 | ||
|   | e476c18c99 | ||
|   | a1b5185ecb | ||
|   | 981e90cc32 | ||
|   | da0a72e8b0 | ||
|   | b7e2e972c7 | ||
|   | 650b2ce6b1 | ||
|   | ecf3d30349 | ||
|   | 15ddd0e284 | ||
|   | 18ac6b270f | ||
|   | 3e35de9b39 | ||
|   | 1e24c72c11 | ||
|   | 217564963d | ||
|   | f2f4649ab0 | ||
|   | 4395ffec5f | ||
|   | 9a7a26407a | ||
|   | 5072a67807 | ||
|   | dce0b6c05a | ||
|   | a4a661bf34 | ||
|   | 771e500468 | ||
|   | 7e3ff03109 | ||
|   | a1827fd680 | ||
|   | 9ce334feac | ||
|   | ed11e0bff6 | ||
|   | 5111086637 | ||
|   | 20f204810e | ||
|   | 4581354e7a | ||
|   | faf4d76388 | ||
|   | a46e255709 | ||
|   | 63e2bbb4d1 | ||
|   | c3dabae237 | ||
|   | f1abcbb7fb | ||
|   | 70efddb90f | ||
|   | f24a5dfd45 | ||
|   | 081074ad9d | ||
|   | ab0cc78d2c | ||
|   | de5c902fdb | ||
|   | cf65169c99 | ||
|   | 745865ee53 | ||
|   | c134fb1939 | ||
|   | 0204d05316 | ||
|   | c345633d80 | ||
|   | a57a94040e | ||
|   | 1bde78d121 | ||
|   | bbd014ad1b | ||
|   | 1287372f5a | ||
|   | d2cb638fcd | ||
|   | bbe4b69c8d | ||
|   | 7f08c06943 | ||
|   | 8f4a6415cd | ||
|   | 0442d6d509 | ||
|   | a3fc6d2a27 | ||
|   | 7db05ac927 | ||
|   | 8bed93b3c5 | ||
|   | 915b49014f | ||
|   | c699f30831 | ||
|   | 3e73e3a906 | ||
|   | 32c65d8a88 | ||
|   | a49328edd3 | ||
|   | 9a15365a57 | ||
|   | 82c864d57e | ||
|   | 6226f875ff | ||
|   | 370015a853 | ||
|   | 6597b7adc0 | ||
|   | 4e53ebfe44 | ||
|   | 04ef1e6405 | ||
|   | b278d07b05 | ||
|   | 6c3896079d | ||
|   | e73fa57d54 | ||
|   | eaa9c7e2a0 | ||
|   | 14ae29d907 | ||
|   | e8f35b02ca | ||
|   | dee3c3e7ba | ||
|   | d8cd2031c7 | ||
|   | 7203e7df5c | ||
|   | b51feffe80 | ||
|   | b1afd554fc | ||
|   | 885e3c574b | ||
|   | 05dd5f3396 | ||
|   | ec3c43faf1 | ||
|   | e72c6685ed | ||
|   | 99d6bd8efc | ||
|   | 4c8587a9f2 | ||
|   | 54a8a05dae | ||
|   | 164a99681b | ||
|   | 0eef4eacd6 | ||
|   | 5764f0c839 | ||
|   | f28e425542 | ||
|   | d1a4f046e9 | ||
|   | 2ce1dc4afe | ||
|   | 37ac249fd7 | ||
|   | f152bea8d8 | ||
|   | 7b089b888a | ||
|   | 68f0e1fe39 | ||
|   | 8032bd0bac | ||
|   | 0c227f2917 | ||
|   | c9fa8118d1 | ||
|   | 63b18246d8 | ||
|   | 16ec37a226 | ||
|   | bd4e5bfc1a | ||
|   | 621fd0ee29 | ||
|   | 6ca8db2f0c | ||
|   | ea129fb206 | ||
|   | 3356d7b6ff | ||
|   | c84023bdc2 | ||
|   | 86f778c0aa | ||
|   | defbbdfe21 | ||
|   | 0f46493477 | ||
|   | 340bac7e42 | ||
|   | 1d3ce9fef1 | ||
|   | 4a398642b8 | ||
|   | 9c89e56c56 | ||
|   | 267c59b1f1 | ||
|   | 2ab17204c6 | ||
|   | 75939047d1 | ||
|   | 2d7f130d2c | ||
|   | f7ae72a36c | ||
|   | 391783e268 | ||
|   | 6f12c08204 | ||
|   | cb8fe70734 | ||
|   | 69d10b747a | ||
|   | da3394f34e | ||
|   | b4c2a9f49f | ||
|   | 7cee77f57a | ||
|   | f28bd1972f | ||
|   | 0f92d1de1b | ||
|   | e59c5c8780 | ||
|   | 86d8026301 | ||
|   | d67b827338 | ||
|   | 660e0dc09a | ||
|   | 3ebc886f8a | ||
|   | 5b54ef840a | ||
|   | c08b0d4974 | ||
|   | 7d652afd87 | ||
|   | 0f61c627b1 | ||
|   | 7126648404 | ||
|   | 4a5e2dc9c7 | ||
|   | 10613686ed | ||
|   | 17ab55115a | ||
|   | 2708c74ebe | ||
|   | 50ff11405f | ||
|   | 31a27838f5 | ||
|   | 2f1b0fe57f | ||
|   | 692f893e1f | ||
|   | 14aa6041ec | ||
|   | fb55fe184c | ||
|   | 6412bfc7b5 | ||
|   | 3c56f38229 | ||
|   | f4f2274c60 | ||
|   | 19ee189468 | ||
|   | a19c7215d2 | ||
|   | 8b84039f1f | ||
|   | 9430dbb96c | ||
|   | 4872df6a46 | ||
|   | 014105f0a0 | ||
|   | b106d1c501 | ||
|   | 99db0672b4 | ||
|   | d584360de2 | ||
|   | 4eed6794c7 | ||
|   | c66cabd80f | ||
|   | 24da3485bd | ||
|   | 7384d2d330 | ||
|   | e5940168fe | ||
|   | 6855baf0f8 | ||
|   | dfd16e8fef | ||
|   | 98a36819bc | ||
|   | de8bc9ca9d | ||
|   | c137f2de4f | ||
|   | 0f55fcafe8 | ||
|   | ed027ec3ee | ||
|   | b3fd79cbb9 | ||
|   | ed4df87b57 | ||
|   | 1321f097b8 | ||
|   | cfa28f0c4a | ||
|   | ab47b717b1 | ||
|   | 65ebb0d2f8 | ||
|   | 49640ce03a | ||
|   | e05cdc83f3 | ||
|   | 992a9ea2f9 | ||
|   | 228351fc13 | ||
|   | 8a5b6f2b86 | ||
|   | 71ecbb3af3 | ||
|   | 5746614ccf | ||
|   | 3a422c3f15 | ||
|   | b3242322fd | ||
|   | 9826640ae6 | ||
|   | 1f5267204b | ||
|   | ed25e1bbd6 | ||
|   | c8491d008f | ||
|   | 08e3405394 | ||
|   | 4ebfa07186 | ||
|   | 6698c189fc | ||
|   | f0639390aa | ||
|   | bbdfed2d5a | ||
|   | 7f4daa2c50 | ||
|   | baf9b67b35 | ||
|   | caf73b0b36 | ||
|   | acf87c2794 | ||
|   | 7f5f6b54fb | ||
|   | a08eb8a446 | ||
|   | b31402766e | ||
|   | 9ab3143bf0 | ||
|   | 81a0cddb9e | ||
|   | f620ac769f | ||
|   | dc91041edd | ||
|   | 6ee08b6717 | ||
|   | 5a2cd2ac84 | ||
|   | 2bd8448aaa | ||
|   | 2360adb592 | ||
|   | c7301a5161 | ||
|   | 72270825c1 | ||
|   | 1e94f0a094 | ||
|   | e39d2567ea | ||
|   | 949136c92a | ||
|   | 9f456a9b19 | ||
|   | 4cf6ba25ca | ||
|   | 093f971896 | ||
|   | df38a9da71 | ||
|   | 813814c54a | ||
|   | 68cb32f375 | ||
|   | 93c9590b0f | ||
|   | 619d979c39 | ||
|   | c30faad838 | ||
|   | bea0de4980 | ||
|   | ef5a490415 | ||
|   | fa404285be | ||
|   | 0e526258ff | ||
|   | 56d2fb9a3b | ||
|   | 7c82690852 | ||
|   | 62acc17e42 | ||
|   | 9fbe5895b7 | ||
|   | 6bbe0f07d4 | ||
|   | bd3e0b9336 | ||
|   | 699debdaca | ||
|   | 70eba568af | ||
|   | bb7560e441 | ||
|   | 43c0cac52f | ||
|   | 4b4aa148a9 | ||
|   | c9c90c4e7f | ||
|   | 99093e9a4c | ||
|   | 2cf33d635d | ||
|   | d6abaf846e | ||
|   | 4b88131977 | ||
|   | 4520f46a57 | ||
|   | 348d47076a | ||
|   | 6e7b90a184 | ||
|   | 28d7a7a6d2 | ||
|   | da13b5dbf2 | ||
|   | a60710e3bb | ||
|   | 7d2a2b9983 | ||
|   | 749df5dacd | ||
|   | af88b7c807 | ||
|   | 4091687733 | ||
|   | cfb0a3ba2a | ||
|   | 6c4d082f35 | ||
|   | 262185046a | ||
|   | da9d00be7d | ||
|   | 454abc388b | ||
|   | 3e9174deed | ||
|   | 4df1047b07 | ||
|   | 60f69feaff | ||
|   | 5df426380d | ||
|   | 976c299657 | ||
|   | 18ab6b51fd | ||
|   | 4be8bd4d18 | ||
|   | 075bc4a6d5 | ||
|   | 1c61feb368 | ||
|   | d32b788988 | ||
|   | 7565ea2787 | ||
|   | 9275975b2c | ||
|   | b3e0d5ba58 | ||
|   | 841dee94c6 | ||
|   | 71638191ee | ||
|   | 9d6851cbbd | ||
|   | d633d05803 | ||
|   | 45d7879d7b | ||
|   | 4a8375355c | ||
|   | d3ebd763a2 | ||
|   | b7f69238a1 | ||
|   | 118a9f224e | ||
|   | a44dc8df37 | ||
|   | abf19aad74 | ||
|   | d73127b175 | ||
|   | 00f4242fa4 | ||
|   | f6a4510659 | ||
|   | 33215424d8 | ||
|   | 6094bc9210 | ||
|   | a8cd9b3aa9 | ||
|   | a189dec1c8 | ||
|   | 858216796a | ||
|   | f24342f117 | ||
|   | 50b55a77de | ||
|   | fdf167db11 | ||
|   | a4f8bd4ee0 | ||
|   | 3e4c12cf56 | ||
|   | 03c39e692a | ||
|   | ab63b0e970 | ||
|   | 6ea42a35a9 | ||
|   | d366dfc72b | ||
|   | 85042fbe25 | ||
|   | 23e5188422 | ||
|   | 93ee0c8798 | ||
|   | aa88486f59 | ||
|   | 1d9c441038 | ||
|   | 928c56bda2 | ||
|   | bc6f37eecc | ||
|   | ffebff8cab | ||
|   | 6d6bd89d6b | ||
|   | 0a64a7e5d4 | ||
|   | 586488af48 | ||
|   | 7b9a45f1a8 | ||
|   | 4ff70aefac | ||
|   | d63b5d7014 | ||
|   | ab5f6bf901 | ||
|   | 04088b34a2 | ||
|   | 3edcd2004e | ||
|   | 7bd52d0245 | ||
|   | 1df65940b9 | ||
|   | d9ace35c3e | ||
|   | 1fe92cee6f | ||
|   | 267868c3b0 | ||
|   | 6d27eb7f64 | ||
|   | 2e10fa494f | ||
|   | 039be65a89 | ||
|   | 570ecd9987 | ||
|   | a575180475 | ||
|   | 07d1a20f3d | ||
|   | 76491cbb31 | ||
|   | bf7d6ddcb2 | ||
|   | 44b969e0b6 | ||
|   | 176e470497 | ||
|   | 646a10d9bf | ||
|   | 52137fd64f | ||
|   | 3ccac8c3b8 | ||
|   | 0be158afa1 | ||
|   | e6942e0122 | ||
|   | 496b22026f | ||
|   | bb2df02dff | ||
|   | 4c850ecc31 | ||
|   | da9c6f6e23 | ||
|   | 58ba0b0b4e | ||
|   | 1d0b87246a | ||
|   | 920b60da19 | ||
|   | 523e66294b | ||
|   | 23f8f35098 | ||
|   | 8d210b5e37 | ||
|   | 3c6c0e6700 | ||
|   | 01344c451f | ||
|   | 2c42c79482 | ||
|   | 75c2cfe7bf | ||
|   | 6c6eeb3f28 | ||
|   | 31053e0cd0 | ||
|   | aad9aced18 | ||
|   | dd2c9eeafe | ||
|   | 740d76bc42 | ||
|   | 45f4f5afd9 | ||
|   | e875de3e98 | ||
|   | fd7786633d | ||
|   | bce9cfa39a | ||
|   | ff3d66a661 | ||
|   | 006d28abd5 | ||
|   | 59b1e63bdf | ||
|   | eab74ef06b | ||
|   | 89837de9b0 | ||
|   | b245931c79 | ||
|   | fd5e42698c | ||
|   | c75512ba6e | ||
|   | a22e7aa0b1 | ||
|   | 020dd97f99 | ||
|   | e9882d9702 | ||
|   | fd4a27dbf2 | ||
|   | 9c63e31da6 | ||
|   | c91f809eba | ||
|   | a54eaf5371 | ||
|   | 8032bd4bb9 | ||
|   | ea1beec2f7 | ||
|   | 05f2f6820e | ||
|   | 0f5f15a5ce | ||
|   | 14ac37e8a5 | ||
|   | 1fae89cbb6 | ||
|   | 8b4008798f | ||
|   | fd4faf59b8 | ||
|   | 109891d668 | ||
|   | bdea796121 | ||
|   | c8813c05c9 | ||
|   | 1cff08ce5d | ||
|   | a868118f6f | ||
|   | e5c62f5750 | ||
|   | 4084e8790b | ||
|   | 8d931dd773 | ||
|   | 25d6366297 | ||
|   | 08cd5b81d1 | ||
|   | 5d3a8a5b1a | ||
|   | 79b84da4b8 | ||
|   | 68b07c5913 | ||
|   | 553db9124d | ||
|   | b495f37299 | ||
|   | 1915547594 | ||
|   | 03de29164a | ||
|   | 86d8b50547 | ||
|   | 7b04386162 | ||
|   | 07bfdf3e4d | ||
|   | d510224e2a | ||
|   | e658f9297d | ||
|   | 2b502e9a0f | ||
|   | 59141f9bbe | ||
|   | 3af66b72f2 | ||
|   | 422c24bd68 | ||
|   | f0f87c8eb9 | ||
|   | 80dad54119 | ||
|   | 56a76df28e | ||
|   | ee2c801fe0 | ||
|   | fc314cc248 | ||
|   | fe231a4c80 | ||
|   | 2e2bbe0a7f | ||
|   | 857e6e8345 | ||
|   | 3402981ada | ||
|   | f401e577e5 | ||
|   | 0241a50c6f | ||
|   | 2a2e1236fc | ||
|   | 9b170f2b4f | ||
|   | 51e9ff59de | ||
|   | 2977dbcded | ||
|   | ac60b51035 | ||
|   | 4c2f33a089 | ||
|   | 3b071116ac | ||
|   | a9f265a591 | ||
|   | 5b62fc8103 | ||
|   | 0598f5f89a | ||
|   | f723427b8b | ||
|   | f69a004c1c | ||
|   | 1134b18a8b | ||
|   | 2e4aa507f7 | ||
|   | 5fb96cdcf4 | ||
|   | e8cba3524e | ||
|   | 7e6b5363f1 | ||
|   | 29457a1d28 | ||
|   | 731455f164 | ||
|   | b01a8cace6 | ||
|   | 72db5b4fac | ||
|   | ddfd42994e | ||
|   | 2a9ff9c5ef | ||
|   | 6d49f05356 | ||
|   | 85a5e62e36 | ||
|   | e67965a381 | ||
|   | ec4723096f | ||
|   | 762b678d24 | ||
|   | 38fcc57bbf | ||
|   | c8c57c74cc | ||
|   | 0784448c69 | ||
|   | de0064af47 | ||
|   | baae1fc84f | ||
|   | 2ab999f4ca | ||
|   | c9f390d6e0 | ||
|   | af05922ecc | ||
|   | 299edbf3ab | ||
|   | c8abed9d48 | ||
|   | 3622c49ce1 | ||
|   | 0462e9a7d9 | ||
|   | c3a6091908 | ||
|   | ab5fedda0b | ||
|   | ba70269398 | ||
|   | 77fd5fa7de | ||
|   | ab74290fe3 | ||
|   | 3aad9d8166 | ||
|   | 572e078d87 | ||
|   | ee4548230b | ||
|   | 96b93bd876 | ||
|   | 927f69fe30 | ||
|   | 7e9ad5927a | ||
|   | 6d6b07865e | ||
|   | 376e7977f0 | ||
|   | 83ae66daea | ||
|   | 89e0be0099 | ||
|   | ef40c1212e | ||
|   | 3a2a2a4ffa | ||
|   | 9592a69986 | ||
|   | 89be07e1f2 | ||
|   | c61c3ae0e9 | ||
|   | 817350c8c5 | ||
|   | 3603b7c82b | ||
|   | 5743c72cca | ||
|   | 4cdd66ceff | ||
|   | d3947d2cfa | ||
|   | 07718b994a | ||
|   | ef9d463bd7 | ||
|   | 8745c7884e | ||
|   | b6965105b7 | ||
|   | 3d269fe8be | ||
|   | be5f00aa1a | ||
|   | 59ba350f34 | ||
|   | 803c5377a6 | ||
|   | 7c12bf7fa1 | ||
|   | ca35a9681f | ||
|   | 9fe5f37337 | ||
|   | 0742901cd2 | ||
|   | 5e4d2dedbe | ||
|   | 411ea56a3e | ||
|   | cda57dd4b4 | ||
|   | 4351de503f | ||
|   | 6339ba6bfb | ||
|   | ef6677f43d | ||
|   | a7824af5a8 | ||
|   | 1eb7d7b7a8 | ||
|   | 11c33d4447 | ||
|   | b8a3cc8b60 | ||
|   | 27c688252d | ||
|   | 3e2afd4b1d | ||
|   | f45b0686d2 | ||
|   | 1f3f881f81 | ||
|   | ceb51bb14f | ||
|   | 3e22573d8d | ||
|   | 79418a3767 | ||
|   | 40d4683de1 | ||
|   | 79e5b54ec7 | ||
|   | bd81923f2f | ||
|   | 69560b8ad7 | ||
|   | dc413e7b73 | ||
|   | 7fc00c446b | ||
|   | 2efc423cf8 | ||
|   | 8ec3086cdd | ||
|   | 5fc7079023 | ||
|   | bfbd254be7 | ||
|   | f8ea43466c | ||
|   | 75ab1fa570 | ||
|   | bf4a46d57c | ||
|   | 1046dd5eda | ||
|   | f9e32a119a | ||
|   | dbb8b8a439 | ||
|   | 2a65c3dc8f | ||
|   | f17ec9e9d7 | ||
|   | 675d6d8328 | ||
|   | 6dc9ccad75 | ||
|   | 6add02702b | ||
|   | 958d6377e3 | ||
|   | 9954154ca2 | ||
|   | 4ecbf8c12c | ||
|   | fc8a3c5fb4 | ||
|   | 01e7dff1a0 | ||
|   | 018c0064cd | ||
|   | c2b016370b | ||
|   | fc791b4371 | ||
|   | f76bb009f4 | ||
|   | 8a1292b295 | ||
|   | d7d80d3fc1 | ||
|   | 41b01003fd | ||
|   | 6557070ae1 | ||
|   | e7e580e177 | ||
|   | dd9ddd2019 | ||
|   | 74aae523ba | ||
|   | 48c40f9516 | ||
|   | e0e7674715 | ||
|   | e1a65276b9 | ||
|   | 469adc85ad | ||
|   | e1b181ca4e | ||
|   | a4f0fbf8b7 | ||
|   | 190cdaddf8 | ||
|   | 5c4ba13839 | ||
|   | e62630cf3e | ||
|   | 36fe7846c0 | ||
|   | 8d150dd67a | ||
|   | 506df00d81 | ||
|   | a9121fa28f | ||
|   | d5a56d9e85 | ||
|   | acf7c0c665 | ||
|   | 619d48c97a | ||
|   | 2cb198c38c | ||
|   | e8e39e0f3c | ||
|   | 37860181d4 | ||
|   | d119dd9a0c | ||
|   | 09ef19f7ec | ||
|   | 6a06c92fa6 | ||
|   | 58ae596b0f | ||
|   | f1ca21678d | ||
|   | d7eeef2c8a | ||
|   | 4f626897f2 | ||
|   | b127e01845 | ||
|   | 2118beeb23 | ||
|   | 5020cd1bbf | ||
|   | cce636224c | ||
|   | 60b3b8ddce | ||
|   | 41446ec9ba | ||
|   | df8b047bca | ||
|   | 12ced52012 | ||
|   | 1d53335ae5 | ||
|   | 971a50d290 | ||
|   | 36dd9106a8 | ||
|   | 0a4ee3ffc7 | ||
|   | cfe32f1a70 | ||
|   | d877f5d5c6 | ||
|   | 0ab6ffefb4 | ||
|   | a292a1d23a | ||
|   | 3f87f6aee3 | ||
|   | 04bcd145d3 | ||
|   | 244e811291 | ||
|   | ac7467fb59 | ||
|   | 2c0436216f | ||
|   | 017fbf267b | ||
|   | e6afbf2ec0 | ||
|   | 906b4aad9e | ||
|   | 4cf8d41f6a | ||
|   | 47c860142e | ||
|   | 2fba3f213b | ||
|   | af7c6f9fce | ||
|   | 78534deab6 | ||
|   | 6710314832 | ||
|   | 0cd4fa6fa0 | ||
|   | 065949496e | ||
|   | 39c82576ae | ||
|   | 37221a508d | ||
|   | 6b43a32a10 | ||
|   | d7cd1ff142 | ||
|   | 659d947863 | ||
|   | 39be7a6288 | ||
|   | 8ac976c579 | ||
|   | 70fd432c57 | ||
|   | 00135f2f49 | ||
|   | 9b944bc29c | ||
|   | d520b3d2a0 | ||
|   | 6f41d9855b | ||
|   | 2d7c1da741 | ||
|   | c0f45b6b1e | ||
|   | 7a0025673c | ||
|   | ad7ec79903 | ||
|   | 0543239cca | ||
|   | ff3dad2457 | ||
|   | 298d5e197b | ||
|   | d73c0a998d | ||
|   | 1b79a3ddbf | ||
|   | a8478ace18 | ||
|   | 72cf5f3f9f | ||
|   | 6f9d493a18 | ||
|   | 08f7d5ebff | ||
|   | 1fe3675403 | ||
|   | a0f956d2c1 | ||
|   | 1560f91b4a | ||
|   | c20f362594 | ||
|   | 7ae8c26e50 | ||
|   | adfffe6121 | ||
|   | 64601baa76 | ||
|   | aa374b51f1 | ||
|   | 5c483745ff | ||
|   | 0c247110a0 | ||
|   | 1643638a78 | ||
|   | 4ace228fc2 | ||
|   | 25aa86a0dc | ||
|   | 70d3b24338 | ||
|   | 8664e9d19b | ||
|   | 50d9877446 | ||
|   | fe06352089 | ||
|   | 7b599419b5 | ||
|   | 491adf072e | ||
|   | f6aae2b048 | ||
|   | d2d5c94633 | ||
|   | 10581f9ef2 | ||
|   | c7e0e1c038 | ||
|   | a914d701eb | ||
|   | 0f9dee6e9c | ||
|   | aa383e2190 | ||
|   | 9bbfcf326c | ||
|   | 3948e67c8f | ||
|   | d56e1b2cc5 | ||
|   | bfac1f1bc2 | ||
|   | d4a956c355 | ||
|   | 6c71fefa58 | ||
|   | ad3003c00a | ||
|   | 0ad5dcb258 | ||
|   | d790309b02 | ||
|   | 1072faf309 | ||
|   | d2c196896d | ||
|   | e42b608444 | ||
|   | 89a501a3af | ||
|   | c19b78180c | ||
|   | c0b750a09a | ||
|   | c967e618a1 | ||
|   | 59f78d7dfc | ||
|   | d8405f0d05 | ||
|   | 0f34f0033c | ||
|   | 190646d50c | ||
|   | a46c6252c6 | ||
|   | 5c1886c8f5 | ||
|   | afcb3d8f34 | ||
|   | 9fbffafdbf | ||
|   | 075f0458f7 | ||
|   | d4568aa0a7 | ||
|   | 97588408a2 | ||
|   | 1def9b301b | ||
|   | 5bac442b18 | ||
|   | 6add682705 | ||
|   | 8b50d84a05 | ||
|   | d3858b81e2 | ||
|   | bdff9769be | ||
|   | c61df75e5e | ||
|   | a74bf2cc27 | ||
|   | ada0f93686 | ||
|   | ff36f2ba17 | ||
|   | 5164cfd399 | ||
|   | 5fa021503e | ||
|   | 7b5d79d313 | ||
|   | 3e3f38500d | ||
|   | 5109b9abfd | ||
|   | 7fb4777c1c | ||
|   | c38533e0f8 | ||
|   | 51ba99d09e | ||
|   | 9159f86a9e | ||
|   | e139f4fc13 | ||
|   | 2fbfeacb87 | ||
|   | ebb7a9fcda | ||
|   | 9e72317302 | ||
|   | d764c20c08 | ||
|   | 9c17b8a098 | ||
|   | 3084873154 | ||
|   | 32809e56d0 | ||
|   | 9f05b182a2 | ||
|   | 525484e834 | ||
|   | 65a4e69cae | ||
|   | e973f8bab9 | ||
|   | 92466671ff | ||
|   | 6d61106070 | ||
|   | ac13749fb8 | ||
|   | 7ec1a9a316 | ||
|   | cf17e21ad3 | ||
|   | 0e0240c4ab | ||
|   | d1b290b91a | ||
|   | a63696836c | ||
|   | 46aad00f16 | ||
|   | 252afe8932 | ||
|   | 9dd467a613 | ||
|   | 4c14df67cc | ||
|   | 20e0fe3ba1 | ||
|   | 6a005135f2 | ||
|   | 82e8375957 | ||
|   | bb25edc09e | ||
|   | 169c0fe4af | ||
|   | cd6918e6eb | ||
|   | 5be035fd44 | ||
|   | f1edc8443c | ||
|   | d9564bd04c | ||
|   | 35f1c396f2 | ||
|   | 6acb950990 | ||
|   | 27e0d1641a | ||
|   | 9ac71ff8af | ||
|   | 075737a4ec | ||
|   | 6d0e4a6a5e | ||
|   | a2544768a0 | ||
|   | 8574a14ed2 | ||
|   | e90c555c18 | ||
|   | 863b9a410f | ||
|   | 23c7bbc7d5 | ||
|   | f900189f90 | ||
|   | 7c74be2790 | ||
|   | 70dd2d4829 | ||
|   | 914b7ee056 | ||
|   | e39f83edbf | ||
|   | 52fe0c6abb | ||
|   | 5cb3e5937f | ||
|   | e0cd224831 | ||
|   | de225ac64a | ||
|   | 5807808a10 | ||
|   | 362877d18f | ||
|   | 88b8dd0149 | ||
|   | 1552f32e09 | ||
|   | 50b73a6720 | ||
|   | 53e51f1735 | ||
|   | 40b63bfebe | ||
|   | 89861eceef | ||
|   | b8eaff66fa | ||
|   | a747fdd27d | ||
|   | 27851bdefa | ||
|   | 3fdeb40ddf | ||
|   | 546c7cebd3 | ||
|   | 473902f5f4 | ||
|   | 41c0721159 | ||
|   | 413d4badfd | ||
|   | c5d67ebf72 | ||
|   | 91818cfa1a | ||
|   | 6263d684d9 | ||
|   | 07140d33a7 | ||
|   | 4ffc388491 | ||
|   | 0ef026c610 | ||
|   | 153c7fdf20 | ||
|   | 90379eeb35 | ||
|   | 3ae959af95 | ||
|   | c8cc652b71 | ||
|   | 4b6285e5c2 | ||
|   | 013de7b3ef | ||
|   | e11e88a9c5 | ||
|   | 7cec8baa55 | ||
|   | e987db9fb5 | ||
|   | c603b9084f | ||
|   | 492d6dfcf0 | ||
|   | a3e0f2dcc3 | ||
|   | cf211e26f4 | ||
|   | c5aaaa7c55 | ||
|   | f86d077e27 | ||
|   | f8076825cb | ||
|   | 201d8a97d4 | ||
|   | d08f326990 | ||
|   | 8dc9d3bc78 | ||
|   | adf95ce3a0 | ||
|   | 3c1aca114f | ||
|   | 18d0fd9d2a | ||
|   | c2e673f978 | ||
|   | 2bde8a1975 | ||
|   | bf9927c7dd | ||
|   | f339a087a2 | ||
|   | 6ccc5f3788 | ||
|   | 1affb91f17 | ||
|   | 7779c3e372 | ||
|   | 49ba7ad22e | ||
|   | 6ad33d60f7 | ||
|   | 0117274061 | ||
|   | e50192a407 | ||
|   | c6fc0e587e | ||
|   | 68c448bc34 | ||
|   | ef62272df7 | ||
|   | 375cd0e42b | ||
|   | 3934821436 | ||
|   | c3b473e4bc | ||
|   | 7ed2c077de | ||
|   | 52a6a7bce8 | ||
|   | 1283167595 | ||
|   | 23c2e22910 | ||
|   | f44b2dbd45 | ||
|   | 46ee2c3f4e | ||
|   | 5d5ec08566 | ||
|   | c3a6179a21 | ||
|   | ef175e3cbe | ||
|   | 4de51d93ef | ||
|   | e7a2144def | ||
|   | 52a2c6958b | ||
|   | 70243d7a47 | ||
|   | b5b8c4b725 | ||
|   | 6c4d81b1e9 | ||
|   | 513d732934 | ||
|   | c88dc8795b | ||
|   | a8030c39b1 | ||
|   | 7243b9e72f | ||
|   | d149af9628 | ||
|   | c0ac2d540b | ||
|   | 528634d755 | ||
|   | 3283439fd4 | ||
|   | c8216f9bc5 | ||
|   | e579f314a6 | ||
|   | 2c4001387e | ||
|   | caa39474cb | ||
|   | d1a7372bd2 | ||
|   | e837bdc8ad | ||
|   | 7265450e2e | ||
|   | 058dbc9f9e | ||
|   | daf9b019c6 | ||
|   | 14eebd582f | ||
|   | 9a8eeacee8 | ||
|   | 45b0bf5bc5 | ||
|   | 88db822c43 | ||
|   | fbf3588fdf | ||
|   | a82ef6bd35 | ||
|   | 312466aaf8 | ||
|   | c0ca99f4b4 | ||
|   | 196f15d240 | ||
|   | bfddef2671 | ||
|   | 44395e8ff0 | ||
|   | 835ece5469 | ||
|   | d93fc67a75 | ||
|   | 838f3cc01e | ||
|   | 4d5841332a | ||
|   | 9b41976252 | ||
|   | d08fd0561a | ||
|   | 30e459252c | ||
|   | a6958ac139 | ||
|   | d7d76f54cc | ||
|   | 970a2e87b3 | ||
|   | cabaae8403 | ||
|   | 79eb5b2ed2 | ||
|   | f0533fca70 | ||
|   | 08e98eeb15 | ||
|   | f2064a84ed | ||
|   | b2f719989d | ||
|   | 6db27c7758 | ||
|   | 3f83919e09 | ||
|   | 72a5b83544 | ||
|   | d2e8ecc646 | ||
|   | 30eb4074cb | ||
|   | 9929e7d8e8 | ||
|   | f6ee252572 | ||
|   | 90d218ebc8 | ||
|   | b0a5dbb4c2 | ||
|   | 0abdfda5a2 | ||
|   | a7ceb04cb7 | ||
|   | 274efb49e7 | ||
|   | b3cd83bbca | ||
|   | b8bd83ba05 | ||
|   | 34dcf49fbc | ||
|   | ef2f8d485b | ||
|   | 9fb9212b0a | ||
|   | f31a24b16d | ||
|   | b436bce565 | ||
|   | 886286a819 | ||
|   | 6d93831488 | ||
|   | bcdadc6581 | ||
|   | 36448191b7 | ||
|   | be5be108c3 | ||
|   | c9ca42aaa9 | ||
|   | c0e2f44092 | ||
|   | 1412fcbb22 | ||
|   | c69dc0f036 | ||
|   | 9b445d89a1 | ||
|   | c3c78428c4 | ||
|   | c6d2bf577f | ||
|   | 25703c1750 | ||
|   | 3a9a3ed184 | ||
|   | 88fae36b8a | ||
|   | fc9d4034a9 | ||
|   | cecc0b932d | ||
|   | 0faed7159c | ||
|   | fb491cfdcf | ||
|   | fc706dcb40 | ||
|   | a2c1b024f3 | ||
|   | 3d865394d7 | ||
|   | 76ef1d0d86 | ||
|   | c694776162 | ||
|   | 9484ec0c17 | ||
|   | 7e2ba41c64 | ||
|   | 614c552e55 | ||
|   | 7db3d84ba2 | ||
|   | bb2c744ec0 | ||
|   | 87f6018468 | ||
|   | 9194c50590 | ||
|   | 873f14bbe0 | ||
|   | 31110b1927 | ||
|   | 7ff45974c6 | ||
|   | 2533a4fc4a | ||
|   | 42284c5efb | ||
|   | 7d7686da33 | ||
|   | 65e455ef0b | ||
|   | ac05e2f2e2 | ||
|   | 787f7b3035 | ||
|   | 31bd642b80 | ||
|   | f0bac6b154 | ||
|   | cc7e74ca11 | ||
|   | e8a44646b8 | ||
|   | ae97d011ae | ||
|   | 1b7657a374 | ||
|   | 5665e04014 | ||
|   | bb70385a42 | ||
|   | 9855877b03 | ||
|   | 21a557a184 | ||
|   | 76c9188fae | ||
|   | e4e5269836 | ||
|   | 9e737df534 | ||
|   | 0b3192c4d5 | ||
|   | 968e6237bd | ||
|   | d780b5a0e4 | ||
|   | 3e48427eaf | ||
|   | 31360c34ed | ||
|   | e9624e2304 | ||
|   | 9c6e64f47d | ||
|   | 0afa601551 | ||
|   | 26dfbb3028 | ||
|   | f16cd987e4 | ||
|   | a94fa81195 | ||
|   | 6119c24720 | ||
|   | 7da205f4c8 | ||
|   | 754fafcfe9 | ||
|   | bd7766b17e | ||
|   | 70b7d73453 | ||
|   | 5ad4702a5b | ||
|   | 40b6fe03c2 | ||
|   | 49ecba2476 | ||
|   | ebd509d92d | ||
|   | 7193374a7e | ||
|   | 6728445542 | ||
|   | 10ed299c78 | ||
|   | 32b124913e | ||
|   | 599ae95251 | ||
|   | d1be34c34a | ||
|   | bc2cac90fe | ||
|   | 28350e3ad9 | ||
|   | f48e6c93b8 | ||
|   | 7cfc24d68f | ||
|   | a58d3ea04d | ||
|   | dfee9954e0 | ||
|   | eed86c760f | ||
|   | c471bb6f67 | ||
|   | 518c2b0f95 | ||
|   | 328fc44194 | ||
|   | b6f735a8f6 | ||
|   | deae08fc4b | ||
|   | c61135ee7b | ||
|   | 97cf15007f | ||
|   | e8302dfbe2 | ||
|   | 558f95cf7e | ||
|   | 18f6ead891 | ||
|   | 10bd25be52 | ||
|   | 65511845d2 | ||
|   | 1c743839ea | ||
|   | bcae9dec41 | ||
|   | 482c9af41f | ||
|   | 2bf2e7461f | ||
|   | 7d1082b1cb | ||
|   | 0dbae83aec | ||
|   | f927c1b997 | ||
|   | 89ec7dad2b | ||
|   | 4fd61345af | ||
|   | 66cca24453 | ||
|   | 2f4062a923 | ||
|   | e733484fab | ||
|   | e5c3183025 | ||
|   | 930c82316a | ||
|   | 3dc22db265 | ||
|   | d8c51cb286 | ||
|   | 2f79d0c3b3 | ||
|   | 5c338cd0a7 | ||
|   | d8bb3af06b | ||
|   | e139e8777b | ||
|   | d52d7cfbd9 | ||
|   | 4f74a259e3 | ||
|   | 74da6e1dc0 | ||
|   | 84ffdf0ed5 | ||
|   | 022b18c8ce | ||
|   | b92b1dcddb | ||
|   | 1472dbb291 | ||
|   | d58a8dc868 | ||
|   | e94be0b70e | ||
|   | f6ae7e1bf1 | ||
|   | 190d857949 | ||
|   | f7b4935677 | ||
|   | a3c49de6a5 | ||
|   | e8dd1b292f | ||
|   | d21264d01b | ||
|   | b0567eadfd | ||
|   | 5fc2058336 | ||
|   | d0567d29d2 | ||
|   | 2b6c271d37 | ||
|   | b0c1a6f73a | ||
|   | 4db0ad32f0 | ||
|   | d065040321 | ||
|   | 17f0fea3fc | ||
|   | 8ca1e43533 | ||
|   | bd01c314dc | ||
|   | 257308d5db | ||
|   | d4620e1654 | ||
|   | e404476609 | ||
|   | 942c870981 | ||
|   | baff9256c5 | ||
|   | b4c0a255fc | ||
|   | 9f6a27c20d | ||
|   | 742dc137ed | ||
|   | 39a6bd33ce | ||
|   | 4672a5fad6 | ||
|   | e649b0a2df | ||
|   | fd8dbe3eff | ||
|   | bb97cc594d | ||
|   | 70a322263e | ||
|   | c6f144d482 | ||
|   | 3709489b3a | ||
|   | 145ef32e28 | ||
|   | 2212800a23 | ||
|   | 2e25431bb6 | ||
|   | 32c8e7522f | ||
|   | a5e4f3cc6b | ||
|   | a30777bd9f | ||
|   | e989195a68 | ||
|   | d7a6127273 | ||
|   | 997d58932e | ||
|   | b4015f877f | ||
|   | 8ee9984e4e | ||
|   | d15fff95b9 | ||
|   | 687e3b13ea | ||
|   | 8c6bb383b7 | ||
|   | 18bee21cfc | ||
|   | e5b6121d17 | ||
|   | bc592c1d13 | ||
|   | 968bd8be67 | ||
|   | d8b8adb88c | ||
|   | f42d820891 | ||
|   | bc21a1fb71 | ||
|   | b7e717ee8c | ||
|   | 3bc31374ac | ||
|   | 858e7bae2b | ||
|   | 8c02d120a2 | ||
|   | 07e353f4ff | ||
|   | bb33d9e600 | ||
|   | 68eb0bdec9 | ||
|   | 32ee8e462c | ||
|   | e79aa54b70 | ||
|   | 9a95652034 | ||
|   | 912c188b53 | ||
|   | e9d0f615ba | ||
|   | 9136573596 | ||
|   | 2487ec94e6 | ||
|   | 811489f157 | ||
|   | b438cc9335 | ||
|   | 1d3d30fa45 | ||
|   | 72b5985398 | ||
|   | 2db60e0a6b | ||
|   | e710848345 | ||
|   | 9e96824161 | ||
|   | 8d6f3c2450 | ||
|   | f863d127e7 | ||
|   | a831110816 | ||
|   | e97bdb53f4 | ||
|   | fe1439fbac | ||
|   | 2bc30e5c22 | ||
|   | 7244c02a0d | ||
|   | 84ca8e1f3e | ||
|   | 6c229ffa68 | ||
|   | cdc5d983f3 | ||
|   | 96688e4dac | ||
|   | 28a945fee9 | ||
|   | c7e777255a | ||
|   | 2dd4cf040e | ||
|   | d1b9eca5eb | ||
|   | 594a67fe28 | ||
|   | cddeaffada | ||
|   | 6b7b71b1f8 | ||
|   | 2a8898e7c3 | ||
|   | ce3f3b09b4 | ||
|   | fe4b3df7e9 | ||
|   | 25bdbcf526 | ||
|   | df7eaa5598 | ||
|   | bb7099376b | ||
|   | 0327fd9710 | ||
|   | e645c6e465 | ||
|   | 78a3d36ccc | ||
|   | 3942858ccd | ||
|   | 03c8d716cc | ||
|   | 60181c4fcb | ||
|   | c215447405 | ||
|   | 89330b89d8 | ||
|   | a8f3718ed0 | ||
|   | a78ba44709 | ||
|   | ff110e3513 | ||
|   | cfae6c63b5 | ||
|   | dbfe49c56f | ||
|   | 98e21f9f5b | ||
|   | 83af0497e4 | ||
|   | 6ce37b44db | ||
|   | 9cb1cf756f | ||
|   | ffa005e4ab | ||
|   | af102e47f1 | ||
|   | 73064a816d | ||
|   | 9b4ae8fcc5 | ||
|   | a1a2c52409 | ||
|   | 9a0b26e0b0 | ||
|   | b805b96e16 | ||
|   | 590e7f7724 | ||
|   | 1a702b08b9 | ||
|   | 8c52dfb804 | ||
|   | 4d61e5e319 | ||
|   | 8c8a63ebfb | ||
|   | e5e34797a8 | ||
|   | 8516ebe6f5 | ||
|   | 9f6205f47f | ||
|   | 8b2ec23a89 | ||
|   | 1816ca6b02 | ||
|   | 7394ff9346 | ||
|   | bb5a6a1c28 | ||
|   | b614b06736 | ||
|   | 7a376c9efc | ||
|   | 518f3d229f | ||
|   | 46c91f923d | ||
|   | 3a2262dfb3 | ||
|   | ff7c38f8e9 | ||
|   | 4229ba364f | ||
|   | ba8e7a211a | ||
|   | 6b41653a32 | ||
|   | 59c1125e72 | ||
|   | b536046720 | ||
|   | 619b805894 | ||
|   | 8662537883 | ||
|   | 717890395b | ||
|   | b7b4164f4f | ||
|   | 7e65296470 | ||
|   | cd5f5d702f | ||
|   | 44b93e7cc4 | ||
|   | 0eb79e5acd | ||
|   | eceba26894 | ||
|   | 0bf404f75e | ||
|   | cd8dd65a65 | ||
|   | 50c56f8b50 | ||
|   | 9e9f8ca8f3 | ||
|   | f63af0601c | ||
|   | 189c671ce2 | ||
|   | bb39a01361 | ||
|   | 3c6a170138 | ||
|   | 764999704a | ||
|   | ecfa4aafc1 | ||
|   | a1e33c4d2f | ||
|   | 7f8ba74dac | ||
|   | e3df62d812 | ||
|   | 1913125881 | ||
|   | e8e58f3fed | ||
|   | 1ca9ec384b | ||
|   | 9522255e3a | ||
|   | 2a22fa694e | ||
|   | 1591f5a0ca | ||
|   | c0c38022ea | ||
|   | 3bc4e9a724 | ||
|   | f7a6bb0723 | ||
|   | e9c17a3ef7 | ||
|   | 29bb5840b5 | ||
|   | c9d8d860f6 | ||
|   | cc18096882 | ||
|   | 15f2a664d1 | ||
|   | 93b66d26ff | ||
|   | 70b4f62ddc | ||
|   | e1023fdfaf | ||
|   | 5e9648387a | ||
|   | 2ba8b4df67 | ||
|   | 3a084c5d7b | ||
|   | f7200e39c3 | ||
|   | a7dfc20967 | ||
|   | 6eb7c0b5d6 | ||
|   | 0b3c078aeb | ||
|   | 750872cc37 | ||
|   | 29895ff474 | ||
|   | 9be2844c82 | ||
|   | 44adccc147 | ||
|   | 2a7e2c70b5 | ||
|   | 8d431b6762 | ||
|   | 273849c0c8 | ||
|   | 5cc14405c7 | ||
|   | f0cfd60e62 | ||
|   | 875c687e3f | ||
|   | d6547f0701 | ||
|   | 3b68905037 | ||
|   | eae611c54d | ||
|   | b37bad35c2 | ||
|   | 5fab15fee5 | ||
|   | 10c8ea17aa | ||
|   | 7058c8ff5a | ||
|   | 64e85da59f | ||
|   | f79fad64aa | ||
|   | cb70eebb08 | ||
|   | edaf8787d1 | ||
|   | 24164c8580 | ||
|   | 9fca7011aa | ||
|   | a0be47ab8b | ||
|   | b13eb3fd40 | ||
|   | b7986a351c | ||
|   | ce87591c62 | ||
|   | 25c289ad3e | ||
|   | 8c5f11b7dd | ||
|   | 7f7dda9ec2 | ||
|   | 9c1005ff0c | ||
|   | 5b36b4472c | ||
|   | a3fcc64aaa | ||
|   | f3078bc903 | ||
|   | 6072744f7e | ||
|   | 40b6de599c | ||
|   | a87ad35a50 | ||
|   | cf56d7e4ed | ||
|   | e33a5eb307 | ||
|   | c1c6f55f8f | ||
|   | e5b704eb32 | ||
|   | 56457bd325 | ||
|   | bdbb3c6657 | ||
|   | 4c7e081e15 | ||
|   | c4d7001489 | ||
|   | c07bac9a63 | ||
|   | d27d04783f | ||
|   | 58de5a7ec7 | ||
|   | 504a9b4746 | ||
|   | cccb5a3e08 | ||
|   | d75fa62cab | ||
|   | 3d43c3c5bc | ||
|   | b570b363d9 | ||
|   | 09392be069 | ||
|   | 5529dab84e | ||
|   | b9968aa1e6 | ||
|   | 60ca704a9e | ||
|   | c0d77808f6 | ||
|   | 9679492c28 | ||
|   | f3b68e6543 | ||
|   | 0dcfaaf5ff | ||
|   | ba513dcb9a | ||
|   | ebabc60477 | ||
|   | cf565d0145 | ||
|   | 52a23e7904 | ||
|   | 9e22b80714 | ||
|   | 7eed9c4a6d | ||
|   | bf42fce17e | ||
|   | 9d421226a7 | ||
|   | 7c4d5cee95 | ||
|   | 7b9be8369e | ||
|   | 7cf4b819ae | ||
|   | 9e1aea33c3 | ||
|   | 8767a88854 | ||
|   | 47c0084641 | ||
|   | 54e6a790cf | ||
|   | 2a86bc8695 | ||
|   | 04538372c6 | ||
|   | 9430ed66cd | ||
|   | 96f8efc27a | ||
|   | a90e8b6112 | ||
|   | 561c1fb798 | ||
|   | 806fec7017 | ||
|   | b3da28eade | ||
|   | 166f6412c2 | ||
|   | 1e877808bc | ||
|   | 1777d9f751 | ||
|   | 309b99eac0 | ||
|   | a5aa1b3917 | ||
|   | aced0632ec | ||
|   | 4e801788d7 | ||
|   | 0b4baad78b | ||
|   | c9286624d4 | ||
|   | 201e32d4c4 | ||
|   | 0980cb6eb5 | ||
|   | f75d23363b | ||
|   | 6c0ba66f17 | ||
|   | f32ce7392e | ||
|   | 193d160bed | ||
|   | 8bf382adad | ||
|   | 541ba357bb | ||
|   | b6578b52e3 | ||
|   | fb01c43ece | ||
|   | b9a012c6e3 | ||
|   | 17684ed8a8 | ||
|   | 1b6b3b2cd5 | ||
|   | acd8567586 | ||
|   | e780c76c93 | ||
|   | 532c6caddf | ||
|   | ef8d9be633 | ||
|   | 2cdbcc5666 | ||
|   | c282a8f328 | ||
|   | b9eab39541 | ||
|   | 20903784a4 | ||
|   | 3ec9ff7467 | ||
|   | 1ddd746862 | ||
|   | 17d3a87b1f | ||
|   | 14c5c60863 | ||
|   | 48ace3de57 | ||
|   | 70a80090c4 | ||
|   | 3395c84560 | ||
|   | b6cb5d09cb | ||
|   | 94c2fc80d2 | ||
|   | 69cfde4516 | ||
|   | bdc83da098 | ||
|   | f872a122a9 | ||
|   | aa92e4cbd0 | ||
|   | e603877a17 | ||
|   | bb96477779 | ||
|   | 543ee79720 | ||
|   | 371db886b4 | ||
|   | ea8cd98361 | ||
|   | 3904ca38c0 | ||
|   | 58849f28a8 | ||
|   | 16527ceaf6 | ||
|   | d66c284bed | ||
|   | 693848280b | ||
|   | 396afaa181 | ||
|   | 05ed29133b | ||
|   | a31c1e8084 | ||
|   | 21891230f2 | ||
|   | 47da76c5a5 | ||
|   | 6017ff2318 | ||
|   | e16d604d0d | ||
|   | feec3e8255 | ||
|   | d3d5703f3f | ||
|   | 62fe92d922 | ||
|   | 512e7be74f | ||
|   | f799db67eb | ||
|   | 3e106a9dc5 | ||
|   | 727abbea8f | ||
|   | 76f81ece62 | ||
|   | 495654f9ff | ||
|   | a0de3fc643 | ||
|   | 95fec2100e | ||
|   | 623a879797 | ||
|   | 4c96d23f48 | ||
|   | 9bc8f6e9d7 | ||
|   | e00e6509ee | ||
|   | be5739508b | ||
|   | 38c867ea94 | ||
|   | 2a985ce6c0 | ||
|   | e4f3fb36f3 | ||
|   | b2f8792873 | ||
|   | 2065133e2d | ||
|   | 86da87f254 | ||
|   | 102a7f8723 | ||
|   | e9afc15719 | ||
|   | 08527dde9b | ||
|   | d9c3a3c9a9 | ||
|   | fe89f9e55e | ||
|   | 73802aabac | ||
|   | bc66733289 | ||
|   | f4c93b2251 | ||
|   | c079c598f2 | ||
|   | 8a2f0063d4 | ||
|   | dfe4b33f2f | ||
|   | 2f7cfa7ab2 | ||
|   | bdcb813ee6 | ||
|   | f0751007f3 | ||
|   | 6ad993704c | ||
|   | 796c3009c7 | ||
|   | 144ff5e716 | ||
|   | 054a1e5ea4 | ||
|   | a223f6056e | ||
|   | a1fd7704e0 | ||
|   | b94227efc9 | ||
|   | 3a7e782c07 | ||
|   | 8f6b33d790 | ||
|   | f476daa041 | ||
|   | acfde9458d | ||
|   | 82e969627a | ||
|   | 9de3c582c0 | ||
|   | 45cff2b51b | ||
|   | 670397a73e | ||
|   | 272eb37e9a | ||
|   | ca79e58ab9 | ||
|   | 977c049875 | ||
|   | aefbc1c9bf | ||
|   | c37a2e61ed | ||
|   | 7f6cd5e469 | ||
|   | f6d1f1985c | ||
|   | 222c31b306 | ||
|   | e99185f011 | ||
|   | 5c662f1230 | ||
|   | a65c7ee2fc | ||
|   | 743c4f554d | ||
|   | 838b2757eb | ||
|   | a92c9fc226 | ||
|   | ed052e0b0b | ||
|   | 7bb8b9039c | ||
|   | 3800b4b45c | ||
|   | cd498711bc | ||
|   | 40766b3375 | ||
|   | d274e45587 | ||
|   | 0a0eb3f710 | ||
|   | 81d054a525 | ||
|   | dc9670c439 | ||
|   | 2e185f4ec9 | ||
|   | 67f347f880 | ||
|   | 03c8079858 | ||
|   | 0cfc527328 | ||
|   | 81542fc6a8 | ||
|   | 5aced279d6 | ||
|   | 3f016f785f | ||
|   | a6427d081e | ||
|   | 8c7fbe20f9 | ||
|   | f66a820e14 | ||
|   | 469aba8ed0 | ||
|   | 6e8e4ad5da | ||
|   | 2f33d654e4 | ||
|   | 760b6385f1 | ||
|   | 91527500f9 | ||
|   | e87d989ca3 | ||
|   | 64d61bae08 | ||
|   | 9862265465 | ||
|   | 624b7616d0 | ||
|   | d53f33bed8 | ||
|   | 02e039d792 | ||
|   | 9f9333315e | ||
|   | 0d10b812fe | ||
|   | 2e6bea23ac | ||
|   | b4fe4f3d10 | ||
|   | ba93fcbda0 | ||
|   | 88d19a4ca4 | ||
|   | ca75dd0728 | ||
|   | af7b9ea898 | ||
|   | e103676b65 | ||
|   | 09cd0468cf | ||
|   | 529aa754f5 | ||
|   | 17e395c2a8 | ||
|   | d50c1f39ab | ||
|   | ef6b25b3bb | ||
|   | 3c7e865555 | ||
|   | 7877ac0c3b | ||
|   | 1442e29d0e | ||
|   | 9a7e9b736e | ||
|   | c421e45fa0 | ||
|   | 8833d21ac3 | ||
|   | 1a3c522c94 | ||
|   | c55aa92d4f | ||
|   | 212a303347 | ||
|   | 3f3568d8af | ||
|   | 1e3bcfc8cd | ||
|   | a4ce9f6f05 | ||
|   | 65dc99744e | ||
|   | c6d4740b0c | ||
|   | 9f91c8b59d | ||
|   | 2b3b087c29 | ||
|   | e08d46aa76 | ||
|   | 9f35fa0fa3 | ||
|   | ff48996bbe | ||
|   | feccc97a14 | ||
|   | 77eec3d21d | ||
|   | ecaafd1b70 | ||
|   | 0d51997e46 | ||
|   | 463cbceb07 | ||
|   | 2fe4d97061 | ||
|   | eb38393cad | ||
|   | 1437c5c63f | ||
|   | 52f1d50902 | ||
|   | a839cb787e | ||
|   | f621fb2060 | ||
|   | 2ccd8b8838 | ||
|   | 7ef0746c52 | ||
|   | 6f609f0dd7 | ||
|   | ee2a30470a | ||
|   | e11fb2c09e | ||
|   | c6e9270590 | ||
|   | 3e2e171407 | ||
|   | e205969b11 | ||
|   | 332f531a10 | ||
|   | 6bf19ecc34 | ||
|   | bae2c9bc63 | ||
|   | 5ac68f8df8 | ||
|   | 6ff45a754d | ||
|   | 06d3b94804 | ||
|   | 32d2df0f08 | ||
|   | e7c314fefc | ||
|   | faab79b41a | ||
|   | 14204c9bfc | ||
|   | 45dbd4464b | ||
|   | 472255924a | ||
|   | 6d3ac2aa55 | ||
|   | 9ad03994d1 | ||
|   | 35228f80b8 | ||
|   | 69ded881c6 | ||
|   | d9bce45db4 | ||
|   | 5e92b4faa9 | ||
|   | db501822ef | ||
|   | f269695d4a | ||
|   | 443af5f760 | ||
|   | 0e35350160 | ||
|   | 10bf497cda | ||
|   | 76eb629fc2 | ||
|   | 91de738563 | ||
|   | ef9948a967 | ||
|   | 0cf13f6393 | ||
|   | 4a8acfd123 | ||
|   | abaffc1908 | ||
|   | ea61d5c1a5 | ||
|   | 298f09402f | ||
|   | d4149d4b7a | ||
|   | 9a14931175 | ||
|   | 165eee102a | ||
|   | 6900c197cd | ||
|   | fe3c66a7c8 | ||
|   | 1d728475e3 | ||
|   | 827057b9f1 | ||
|   | 1716452203 | ||
|   | 54827cacb9 | ||
|   | e3a4a16507 | ||
|   | 3315228a90 | ||
|   | f72205c401 | ||
|   | 11862bbaee | ||
|   | ef1d1303f4 | ||
|   | 8d846993ee | ||
|   | 1f84626278 | ||
|   | b4cfe6e9c0 | ||
|   | 94a861e318 | ||
|   | 1421e775d2 | ||
|   | f8eab72c7a | ||
|   | 2afd2f0d3b | ||
|   | 2b72f40cec | ||
|   | ff5c0d6361 | ||
|   | edd4b477f8 | ||
|   | 198b14e5fc | ||
|   | f9fea265cf | ||
|   | 668601ca23 | ||
|   | 04fcb33d7e | ||
|   | 99406f2099 | ||
|   | 632b3cb9ae | ||
|   | f31d2486c9 | ||
|   | 7dea682713 | ||
|   | 7955ddceb2 | ||
|   | 0bf04c04f9 | ||
|   | dc29018ec0 | ||
|   | b6412afe96 | ||
|   | 4e88186903 | ||
|   | f387378b69 | ||
|   | f894e6b4ea | ||
|   | e33f5996f3 | ||
|   | 8f7f1ff7dd | ||
|   | 54a0e52e05 | ||
|   | b2431b982f | ||
|   | 8d6d619eed | ||
|   | 70e332b9e8 | ||
|   | 0a53c42a8a | ||
|   | 42a66ad49e | ||
|   | 2d1d70b3b6 | ||
|   | 0ccc92dc1e | ||
|   | c9157cc13b | ||
|   | 2b1270381d | ||
|   | cdb8ee3946 | ||
|   | 1e3586621b | ||
|   | c07e9ac29d | ||
|   | 6e3bb48574 | ||
|   | a180395832 | ||
|   | 3dfcc6b0be | ||
|   | 16d7ae62bd | ||
|   | eea3cb32a5 | ||
|   | 670fe8590c | ||
|   | 30c048723c | ||
|   | 85dc669ddf | ||
|   | 397c1a1c2b | ||
|   | f1d3e35aac | ||
|   | 0e69201f05 | ||
|   | f8fdaf5c1f | ||
|   | 1f3b81338c | ||
|   | 5921d3a42a | ||
|   | dbbc85719e | ||
|   | 0ddb6c3f10 | ||
|   | f760a9d0c2 | ||
|   | e13281726c | ||
|   | 0ddf4355a1 | ||
|   | 7c8a3ca1a8 | ||
|   | 3068738a70 | ||
|   | cfa0d8b7c0 | ||
|   | 7ac41652f7 | ||
|   | 24a510bc2e | ||
|   | 0498540439 | ||
|   | da94c2e1e5 | ||
|   | bcdd74514f | ||
|   | 1d0c36a0ab | ||
|   | be1dcb7264 | ||
|   | a34ea8f131 | ||
|   | 7fbfa6a52b | ||
|   | 799ef3380d | ||
|   | d5087858ca | ||
|   | d9fc5650b8 | ||
|   | 9ea028f5ab | ||
|   | aa309087fd | ||
|   | 57bdd9d3bf | ||
|   | dc9871fe5b | ||
|   | 3255ca3ea4 | ||
|   | a06ef6fe25 | ||
|   | 696d256fa0 | ||
|   | 70e8ad7104 | ||
|   | f785dcac3d | ||
|   | aa54ef10ae | ||
|   | 14946da163 | ||
|   | 5f9bcfbefe | ||
|   | aa2eed2c38 | ||
|   | 6bff6e9cff | ||
|   | 023d369b74 | ||
|   | c9d4241afe | ||
|   | e1279c29c2 | ||
|   | 2d6fb1c45e | ||
|   | cd9643fb15 | ||
|   | f64f95d8ff | ||
|   | 88c25a9390 | ||
|   | e4ace49536 | ||
|   | 3a0df56605 | ||
|   | 98cdee7f03 | ||
|   | f140f5f14b | ||
|   | 88a97319cc | ||
|   | c69db035ee | ||
|   | 60a7eaf2bb | ||
|   | 3f43567c8f | ||
|   | 0f12a9de3b | ||
|   | 937b9009e0 | ||
|   | 66b6098d32 | ||
|   | 348bc1d0fc | ||
|   | b56a757f2e | ||
|   | f7c0499158 | ||
|   | 9ebcefee00 | ||
|   | 957e319649 | ||
|   | a8978a0d4d | ||
|   | 10712c5ec0 | ||
|   | 83c39f57f0 | ||
|   | 173757cfa2 | ||
|   | c6be73dba2 | ||
|   | ccf293906a | ||
|   | 0f4c0b95e2 | ||
|   | 82973e7608 | ||
|   | c011bccc45 | ||
|   | 8473caf5a6 | ||
|   | 85b038525b | ||
|   | 51a5c3c664 | ||
|   | d6cda9df0a | ||
|   | ca7d09d1cb | ||
|   | 4ab478c49c | ||
|   | 1a1c1fd0da | ||
|   | 370951ab67 | ||
|   | a0632a572a | ||
|   | 10601e7760 | ||
|   | 088ce9c2ad | ||
|   | e1a69b97db | ||
|   | a2fd45bb95 | ||
|   | 01ddd8eaa8 | ||
|   | 22fa57b82c | ||
|   | 92a51ca546 | ||
|   | 6a9234e634 | ||
|   | e8d062a95a | ||
|   | 3394d64f6c | ||
|   | 0fd5a277ed | ||
|   | 8eef2818fa | ||
|   | a15703d5af | ||
|   | 34d8165edd | ||
|   | 1759add2b6 | ||
|   | dd80f1b997 | ||
|   | 90ff602ecd | ||
|   | 0099ff1321 | 
							
								
								
									
										18
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| # Set the default behavior, in case people don't have core.autocrlf set. | ||||
| * text eol=lf | ||||
|  | ||||
| # Explicitly declare text files you want to always be normalized and converted | ||||
| # to native line endings on checkout. | ||||
| # *.c text | ||||
| # *.h text | ||||
|  | ||||
| # Declare files that will always have CRLF line endings on checkout. | ||||
| *.cmd text eol=crlf | ||||
| *.bat text eol=crlf | ||||
|  | ||||
| # Denote all files that are truly binary and should not be modified. | ||||
| chromeos/** binary | ||||
| *.jar binary | ||||
| *.exe binary | ||||
| *.apk binary | ||||
| *.png binary | ||||
							
								
								
									
										21
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,12 +1,17 @@ | ||||
| out | ||||
| *.zip | ||||
| *.jks | ||||
| *.apk | ||||
| config.prop | ||||
| update.sh | ||||
|  | ||||
| # Built binaries | ||||
| native/out | ||||
|  | ||||
| # Android Studio / Gradle | ||||
| *.iml | ||||
| .gradle | ||||
| /local.properties | ||||
| .idea/ | ||||
| /.idea | ||||
| /build | ||||
| app/release | ||||
| *.hprof | ||||
| .externalNativeBuild/ | ||||
| src/full/res/raw/util_functions.sh | ||||
| public.certificate.x509.pem | ||||
| private.key.pk8 | ||||
| *.apk | ||||
| /captures | ||||
|   | ||||
							
								
								
									
										21
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| [submodule "selinux"] | ||||
| 	path = native/jni/external/selinux | ||||
| 	url = https://github.com/topjohnwu/selinux.git | ||||
| [submodule "busybox"] | ||||
| 	path = native/jni/external/busybox | ||||
| 	url = https://github.com/topjohnwu/ndk-busybox.git | ||||
| [submodule "dtc"] | ||||
| 	path = native/jni/external/dtc | ||||
| 	url = https://github.com/dgibson/dtc | ||||
| [submodule "lz4"] | ||||
| 	path = native/jni/external/lz4 | ||||
| 	url = https://github.com/lz4/lz4.git | ||||
| [submodule "bzip2"] | ||||
| 	path = native/jni/external/bzip2 | ||||
| 	url = https://github.com/nemequ/bzip2.git | ||||
| [submodule "xz"] | ||||
| 	path = native/jni/external/xz | ||||
| 	url = https://github.com/xz-mirror/xz.git | ||||
| [submodule "nanopb"] | ||||
| 	path = native/jni/external/nanopb | ||||
| 	url = https://github.com/nanopb/nanopb.git | ||||
							
								
								
									
										54
									
								
								README.MD
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								README.MD
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| # Magisk | ||||
|  | ||||
| [Downloads](https://github.com/topjohnwu/Magisk/releases) \| [Documentation](https://topjohnwu.github.io/Magisk/) \| [XDA Thread](https://forum.xda-developers.com/apps/magisk/official-magisk-v7-universal-systemless-t3473445) | ||||
|  | ||||
| ## Introduction | ||||
|  | ||||
| Magisk is a suite of open source tools for customizing Android, supporting devices higher than Android 4.2 (API 17). It covers the fundamental parts for Android customization: root, boot scripts, SELinux patches, AVB2.0 / dm-verity / forceencrypt removals etc. | ||||
|  | ||||
| Furthermore, Magisk provides a **Systemless Interface** to alter the system (or vendor) arbitrarily while the actual partitions stay completely intact. With its systemless nature along with several other hacks, Magisk can hide modifications from nearly any system integrity verifications used in banking apps, corporation monitoring apps, game cheat detections, and most importantly [Google's SafetyNet API](https://developer.android.com/training/safetynet/index.html). | ||||
|  | ||||
| ## Bug Reports | ||||
|  | ||||
| **Make sure to install the latest [Canary Build](https://forum.xda-developers.com/apps/magisk/dev-magisk-canary-channel-bleeding-edge-t3839337) before reporting any bugs!** **DO NOT** report bugs that is already fixed upstream. Follow the instructions in the [Canary Channel XDA Thread](https://forum.xda-developers.com/apps/magisk/dev-magisk-canary-channel-bleeding-edge-t3839337), and report a bug either by opening an issue on GitHub or directly in the thread. | ||||
|  | ||||
| ## Building Environment Requirements | ||||
|  | ||||
| -  Python 3: run `build.py` script | ||||
| -  Java Development Kit (JDK) 8: Compile Magisk Manager and sign zips | ||||
| -  Latest Android SDK: set `ANDROID_HOME` environment variable to the path to Android SDK | ||||
| -  Android NDK: Install NDK along with SDK (`$ANDROID_HOME/ndk-bundle`), or optionally specify a custom path `ANDROID_NDK_HOME` | ||||
| -  (Windows Only) Python package Colorama: Install with `pip install colorama`, used for ANSI color codes | ||||
|  | ||||
| ## Building Notes and Instructions | ||||
|  | ||||
| -  Clone sources with submodules: `git clone --recurse-submodules https://github.com/topjohnwu/Magisk.git` | ||||
| -  Building is supported on macOS, Linux, and Windows. Official releases are built and tested with [FrankeNDK](https://github.com/topjohnwu/FrankeNDK); point `ANDROID_NDK_HOME` to FrankeNDK if you want to use it for compiling. | ||||
| -  Set configurations in `config.prop`. A sample file `config.prop.sample` is provided as an example. | ||||
| -  Run `build.py` with argument `-h` to see the built-in help message. The `-h` option also works for each supported actions, e.g. `./build.py binary -h` | ||||
| -  By default, `build.py` build binaries and Magisk Manager in debug mode. If you want to build Magisk Manager in release mode (via the `-r, --release` flag), you need a Java Keystore file `release-key.jks` (only `JKS` format is supported) to sign APKs and zips. For more information, check out [Google's Official Documentation](https://developer.android.com/studio/publish/app-signing.html#signing-manually). | ||||
|  | ||||
| ## Translations | ||||
|  | ||||
| Default string resources for Magisk Manager are scattered throughout | ||||
|  | ||||
| - `app/src/main/res/values/strings.xml` | ||||
| - `stub/src/main/res/values/strings.xml` | ||||
| - `shared/src/main/res/values/strings.xml` | ||||
|  | ||||
| Translate each and place them in the respective locations (`<module>/src/main/res/values-<lang>/strings.xml`). | ||||
|  | ||||
| ## License | ||||
|  | ||||
|     Magisk, including all git submodules are free software: | ||||
|     you can redistribute it and/or modify it under the terms of the | ||||
|     GNU General Public License as published by the Free Software Foundation, | ||||
|     either version 3 of the License, or (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| @@ -1,7 +0,0 @@ | ||||
| # Magisk Manager | ||||
| This repo is no longer an independent component. It is a submodule of the [Magisk Project](https://github.com/topjohnwu/Magisk). | ||||
|  | ||||
| # Translations | ||||
| The default (English) string resources are scattered in these files: `src/full/res/values/strings.xml`, `src/main/res/values/strings.xml`, `src/stub/res/values/strings.xml`.   | ||||
| Place the translated XMLs in the corresponding folder to the locale.   | ||||
| Translations are highly appreciated via pull requests here on Github. | ||||
							
								
								
									
										11
									
								
								app/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								app/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| *.iml | ||||
| .gradle | ||||
| /local.properties | ||||
| .idea/ | ||||
| /build | ||||
| app/release | ||||
| *.hprof | ||||
| .externalNativeBuild/ | ||||
| public.certificate.x509.pem | ||||
| private.key.pk8 | ||||
| *.apk | ||||
							
								
								
									
										51
									
								
								app/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								app/build.gradle
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| apply plugin: 'com.android.application' | ||||
|  | ||||
| android { | ||||
|     defaultConfig { | ||||
|         applicationId 'com.topjohnwu.magisk' | ||||
|         vectorDrawables.useSupportLibrary = true | ||||
|         versionName rootProject.ext.configProps['appVersion'] | ||||
|         versionCode rootProject.ext.configProps['appVersionCode'] as Integer | ||||
|         javaCompileOptions { | ||||
|             annotationProcessorOptions { | ||||
|                 argument('butterknife.debuggable', 'false') | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     buildTypes { | ||||
|         release { | ||||
|             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|     implementation fileTree(include: ['*.jar'], dir: 'libs') | ||||
|     implementation project(':net') | ||||
|     implementation project(':shared') | ||||
|     implementation project(':signing') | ||||
|     implementation 'ru.noties:markwon:2.0.1' | ||||
|     implementation 'com.caverock:androidsvg-aar:1.3' | ||||
|     implementation 'org.kamranzafar:jtar:2.3' | ||||
|     implementation 'net.sourceforge.streamsupport:android-retrostreams:1.7.0' | ||||
|     implementation 'com.github.sevar83:indeterminate-checkbox:1.0.5' | ||||
|  | ||||
|     def androidXVersion = "1.0.0" | ||||
|     implementation 'androidx.constraintlayout:constraintlayout:1.1.3' | ||||
|     implementation 'androidx.appcompat:appcompat:1.0.2' | ||||
|     implementation "androidx.preference:preference:${androidXVersion}" | ||||
|     implementation "androidx.recyclerview:recyclerview:${androidXVersion}" | ||||
|     implementation "androidx.cardview:cardview:${androidXVersion}" | ||||
|     implementation "com.google.android.material:material:${androidXVersion}" | ||||
|     implementation 'androidx.work:work-runtime:2.0.0' | ||||
|     implementation 'androidx.transition:transition:1.1.0-alpha02' | ||||
|  | ||||
|     def libsuVersion = '2.3.2' | ||||
|     implementation "com.github.topjohnwu.libsu:core:${libsuVersion}" | ||||
|     implementation "com.github.topjohnwu.libsu:io:${libsuVersion}" | ||||
|  | ||||
|     def butterKnifeVersion = '10.1.0' | ||||
|     implementation "com.jakewharton:butterknife-runtime:${butterKnifeVersion}" | ||||
|     annotationProcessor "com.jakewharton:butterknife-compiler:${butterKnifeVersion}" | ||||
| } | ||||
							
								
								
									
										49
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								app/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | ||||
| # Add project specific ProGuard rules here. | ||||
| # By default, the flags in this file are appended to flags specified | ||||
| # in /Users/topjohnwu/Library/Android/sdk/tools/proguard/proguard-android.txt | ||||
| # You can edit the include path and order by changing the proguardFiles | ||||
| # directive in build.gradle. | ||||
| # | ||||
| # For more details, see | ||||
| #   http://developer.android.com/guide/developing/tools/proguard.html | ||||
|  | ||||
| # Add any project specific keep options here: | ||||
|  | ||||
| # If your project uses WebView with JS, uncomment the following | ||||
| # and specify the fully qualified class name to the JavaScript interface | ||||
| # class: | ||||
| #-keepclassmembers class fqcn.of.javascript.interface.for.webview { | ||||
| #   public *; | ||||
| #} | ||||
|  | ||||
| # BouncyCastle | ||||
| -keep,allowoptimization class org.bouncycastle.jcajce.provider.asymmetric.rsa.**SHA1** { *; } | ||||
| -keep,allowoptimization class org.bouncycastle.jcajce.provider.asymmetric.RSA** { *; } | ||||
| -keep,allowoptimization class org.bouncycastle.jcajce.provider.digest.SHA1** { *; } | ||||
| -dontwarn javax.naming.** | ||||
|  | ||||
| # Snet | ||||
| -keepclassmembers class com.topjohnwu.magisk.utils.ISafetyNetHelper { *; } | ||||
| -keep,allowobfuscation interface com.topjohnwu.magisk.utils.ISafetyNetHelper$Callback | ||||
| -keepclassmembers class * implements com.topjohnwu.magisk.utils.ISafetyNetHelper$Callback { | ||||
|   void onResponse(int); | ||||
| } | ||||
|  | ||||
| # BootSigner | ||||
| -keepclassmembers class com.topjohnwu.signing.BootSigner { *; } | ||||
|  | ||||
| # SVG | ||||
| -dontwarn com.caverock.androidsvg.SVGAndroidRenderer | ||||
|  | ||||
| # RetroStreams | ||||
| -dontwarn java9.** | ||||
|  | ||||
| # Strip logging | ||||
| -assumenosideeffects class com.topjohnwu.magisk.utils.Logger { | ||||
|   public *** debug(...); | ||||
| } | ||||
|  | ||||
| # Excessive obfuscation | ||||
| -repackageclasses 'a' | ||||
| -allowaccessmodification | ||||
| -optimizationpasses 6 | ||||
| @@ -1,21 +1,28 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     package="com.topjohnwu.magisk"> | ||||
|  | ||||
|     <uses-permission android:name="android.permission.VIBRATE" /> | ||||
|     <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> | ||||
|     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> | ||||
|     <uses-permission android:name="android.permission.USE_FINGERPRINT" /> | ||||
|  | ||||
|     <application | ||||
|         android:name=".MagiskManager" | ||||
|         android:theme="@style/AppTheme"> | ||||
|         android:allowBackup="true" | ||||
|         android:name="a.e" | ||||
|         android:theme="@style/AppTheme" | ||||
|         android:usesCleartextTraffic="true" | ||||
|         tools:ignore="UnusedAttribute,GoogleAppIndexingWarning"> | ||||
|  | ||||
|         <!-- Activities --> | ||||
|  | ||||
|         <activity | ||||
|             android:name=".MainActivity" | ||||
|             android:name="a.b" | ||||
|             android:configChanges="orientation|screenSize" | ||||
|             android:exported="true" /> | ||||
|         <activity | ||||
|             android:name=".SplashActivity" | ||||
|             android:name="a.c" | ||||
|             android:configChanges="orientation|screenSize" | ||||
|             android:exported="true" | ||||
|             android:theme="@style/SplashTheme"> | ||||
| @@ -25,57 +32,46 @@ | ||||
|             </intent-filter> | ||||
|         </activity> | ||||
|         <activity | ||||
|             android:name=".AboutActivity" | ||||
|             android:theme="@style/AppTheme.StatusBar" /> | ||||
|         <activity | ||||
|             android:name=".SettingsActivity" | ||||
|             android:theme="@style/AppTheme.StatusBar" /> | ||||
|         <activity | ||||
|             android:name=".FlashActivity" | ||||
|             android:name="a.f" | ||||
|             android:configChanges="keyboardHidden|orientation|screenSize" | ||||
|             android:screenOrientation="nosensor" | ||||
|             android:theme="@style/AppTheme.StatusBar" /> | ||||
|             android:theme="@style/AppTheme.NoDrawer" /> | ||||
|  | ||||
|         <!-- Superuser --> | ||||
|  | ||||
|         <activity | ||||
|             android:name=".NoUIActivity" | ||||
|             android:theme="@style/AppTheme.Translucent" /> | ||||
|         <activity | ||||
|             android:name=".superuser.RequestActivity" | ||||
|             android:name="a.m" | ||||
|             android:directBootAware="true" | ||||
|             android:excludeFromRecents="true" | ||||
|             android:launchMode="singleTask" | ||||
|             android:taskAffinity="internal.superuser" | ||||
|             android:taskAffinity="a.m" | ||||
|             android:theme="@style/SuRequest" /> | ||||
|  | ||||
|         <receiver android:name=".superuser.SuReceiver" /> | ||||
|         <receiver android:name=".receivers.BootReceiver"> | ||||
|         <!-- Receiver --> | ||||
|  | ||||
|         <receiver | ||||
|             android:name="a.h" | ||||
|             android:directBootAware="true"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.BOOT_COMPLETED" /> | ||||
|                 <action android:name="android.intent.action.LOCALE_CHANGED" /> | ||||
|             </intent-filter> | ||||
|         </receiver> | ||||
|         <receiver android:name=".receivers.PackageReceiver"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.PACKAGE_REPLACED" /> | ||||
|                 <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" /> | ||||
|  | ||||
|                 <data android:scheme="package" /> | ||||
|             </intent-filter> | ||||
|         </receiver> | ||||
|         <receiver android:name=".receivers.ManagerUpdate" /> | ||||
|         <receiver android:name=".receivers.RebootReceiver" /> | ||||
|         <receiver android:name=".receivers.ShortcutReceiver"> | ||||
|             <intent-filter> | ||||
|                 <action android:name="android.intent.action.LOCALE_CHANGED" /> | ||||
|             </intent-filter> | ||||
|         </receiver> | ||||
|  | ||||
|         <service android:name=".services.OnBootIntentService" /> | ||||
|         <service | ||||
|             android:name=".services.UpdateCheckService" | ||||
|             android:exported="true" | ||||
|             android:permission="android.permission.BIND_JOB_SERVICE" /> | ||||
|         <!-- Service --> | ||||
|  | ||||
|         <service android:name="a.j" /> | ||||
|  | ||||
|         <!-- Hardcode GMS version --> | ||||
|         <meta-data | ||||
|             android:name="com.google.android.gms.version" | ||||
|             android:value="7095000" /> | ||||
|             android:value="12451000" /> | ||||
|  | ||||
|     </application> | ||||
|  | ||||
							
								
								
									
										13
									
								
								app/src/main/java/a/a.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								app/src/main/java/a/a.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.utils.PatchAPK; | ||||
| import com.topjohnwu.signing.BootSigner; | ||||
|  | ||||
| import androidx.annotation.Keep; | ||||
|  | ||||
| @Keep | ||||
| public class a extends BootSigner { | ||||
|     public static boolean patchAPK(String in, String out, String pkg) { | ||||
|         return PatchAPK.patch(in, out, pkg); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/main/java/a/b.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/main/java/a/b.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.MainActivity; | ||||
|  | ||||
| public class b extends MainActivity { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/main/java/a/c.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/main/java/a/c.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.SplashActivity; | ||||
|  | ||||
| public class c extends SplashActivity { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/main/java/a/e.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/main/java/a/e.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.App; | ||||
|  | ||||
| public class e extends App { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/main/java/a/f.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/main/java/a/f.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.FlashActivity; | ||||
|  | ||||
| public class f extends FlashActivity { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										15
									
								
								app/src/main/java/a/g.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								app/src/main/java/a/g.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| package a; | ||||
|  | ||||
| import android.content.Context; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.UpdateCheckService; | ||||
|  | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.work.WorkerParameters; | ||||
|  | ||||
| public class g extends w<UpdateCheckService> { | ||||
|     /* Stub */ | ||||
|     public g(@NonNull Context context, @NonNull WorkerParameters workerParams) { | ||||
|         super(context, workerParams); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/main/java/a/h.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/main/java/a/h.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.GeneralReceiver; | ||||
|  | ||||
| public class h extends GeneralReceiver { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/main/java/a/j.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/main/java/a/j.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.DownloadModuleService; | ||||
|  | ||||
| public class j extends DownloadModuleService { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										7
									
								
								app/src/main/java/a/m.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/main/java/a/m.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| package a; | ||||
|  | ||||
| import com.topjohnwu.magisk.SuRequestActivity; | ||||
|  | ||||
| public class m extends SuRequestActivity { | ||||
|     /* stub */ | ||||
| } | ||||
							
								
								
									
										42
									
								
								app/src/main/java/a/w.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								app/src/main/java/a/w.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| package a; | ||||
|  | ||||
| import android.content.Context; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.DelegateWorker; | ||||
|  | ||||
| import java.lang.reflect.ParameterizedType; | ||||
|  | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.work.Worker; | ||||
| import androidx.work.WorkerParameters; | ||||
|  | ||||
| public abstract class w<T extends DelegateWorker> extends Worker { | ||||
|  | ||||
|     /* Wrapper class to workaround Proguard -keep class * extends Worker */ | ||||
|  | ||||
|     private T base; | ||||
|  | ||||
|     @SuppressWarnings("unchecked") | ||||
|     w(@NonNull Context context, @NonNull WorkerParameters workerParams) { | ||||
|         super(context, workerParams); | ||||
|         try { | ||||
|             base = ((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) | ||||
|                     .getActualTypeArguments()[0]).newInstance(); | ||||
|             base.setActualWorker(this); | ||||
|         } catch (Exception ignored) {} | ||||
|     } | ||||
|  | ||||
|     @NonNull | ||||
|     @Override | ||||
|     public Result doWork() { | ||||
|         if (base == null) | ||||
|             return Result.failure(); | ||||
|         return base.doWork(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onStopped() { | ||||
|         if (base != null) | ||||
|             base.onStopped(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										62
									
								
								app/src/main/java/com/topjohnwu/magisk/App.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								app/src/main/java/com/topjohnwu/magisk/App.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.app.Application; | ||||
| import android.content.Context; | ||||
| import android.content.SharedPreferences; | ||||
| import android.content.res.Configuration; | ||||
| import android.os.AsyncTask; | ||||
| import android.os.Build; | ||||
| import android.preference.PreferenceManager; | ||||
|  | ||||
| import com.topjohnwu.magisk.database.MagiskDB; | ||||
| import com.topjohnwu.magisk.database.RepoDatabaseHelper; | ||||
| import com.topjohnwu.magisk.utils.LocaleManager; | ||||
| import com.topjohnwu.magisk.utils.RootUtils; | ||||
| import com.topjohnwu.net.Networking; | ||||
| import com.topjohnwu.superuser.Shell; | ||||
|  | ||||
| import java.util.concurrent.ThreadPoolExecutor; | ||||
|  | ||||
| public class App extends Application { | ||||
|  | ||||
|     public static App self; | ||||
|     public static Context deContext; | ||||
|     public static ThreadPoolExecutor THREAD_POOL; | ||||
|  | ||||
|     // Global resources | ||||
|     public SharedPreferences prefs; | ||||
|     public MagiskDB mDB; | ||||
|     public RepoDatabaseHelper repoDB; | ||||
|  | ||||
|     static { | ||||
|         Shell.Config.setFlags(Shell.FLAG_MOUNT_MASTER | Shell.FLAG_USE_MAGISK_BUSYBOX); | ||||
|         Shell.Config.verboseLogging(BuildConfig.DEBUG); | ||||
|         Shell.Config.addInitializers(RootUtils.class); | ||||
|         Shell.Config.setTimeout(2); | ||||
|         THREAD_POOL = (ThreadPoolExecutor) AsyncTask.THREAD_POOL_EXECUTOR; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void attachBaseContext(Context base) { | ||||
|         super.attachBaseContext(base); | ||||
|         self = this; | ||||
|         deContext = base; | ||||
|  | ||||
|         if (Build.VERSION.SDK_INT >= 24) { | ||||
|             deContext = base.createDeviceProtectedStorageContext(); | ||||
|             deContext.moveSharedPreferencesFrom(base, | ||||
|                     PreferenceManager.getDefaultSharedPreferencesName(base)); | ||||
|         } | ||||
|         prefs = PreferenceManager.getDefaultSharedPreferences(deContext); | ||||
|         mDB = new MagiskDB(base); | ||||
|  | ||||
|         Networking.init(base); | ||||
|         LocaleManager.setLocale(this); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onConfigurationChanged(Configuration newConfig) { | ||||
|         super.onConfigurationChanged(newConfig); | ||||
|         LocaleManager.setLocale(this); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										27
									
								
								app/src/main/java/com/topjohnwu/magisk/ClassMap.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								app/src/main/java/com/topjohnwu/magisk/ClassMap.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.DownloadModuleService; | ||||
| import com.topjohnwu.magisk.components.GeneralReceiver; | ||||
| import com.topjohnwu.magisk.components.UpdateCheckService; | ||||
|  | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| public class ClassMap { | ||||
|     private static Map<Class, Class> classMap = new HashMap<>(); | ||||
|  | ||||
|     static { | ||||
|         classMap.put(App.class, a.e.class); | ||||
|         classMap.put(MainActivity.class, a.b.class); | ||||
|         classMap.put(SplashActivity.class, a.c.class); | ||||
|         classMap.put(FlashActivity.class, a.f.class); | ||||
|         classMap.put(UpdateCheckService.class, a.g.class); | ||||
|         classMap.put(GeneralReceiver.class, a.h.class); | ||||
|         classMap.put(DownloadModuleService.class, a.j.class); | ||||
|         classMap.put(SuRequestActivity.class, a.m.class); | ||||
|     } | ||||
|      | ||||
|     public static <T> Class<T> get(Class c) { | ||||
|         return classMap.get(c); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										398
									
								
								app/src/main/java/com/topjohnwu/magisk/Config.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										398
									
								
								app/src/main/java/com/topjohnwu/magisk/Config.java
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										105
									
								
								app/src/main/java/com/topjohnwu/magisk/Const.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								app/src/main/java/com/topjohnwu/magisk/Const.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.os.Environment; | ||||
| import android.os.Process; | ||||
|  | ||||
| import java.io.File; | ||||
|  | ||||
| public class Const { | ||||
|  | ||||
|     public static final String DEBUG_TAG = "MagiskManager"; | ||||
|  | ||||
|     // APK content | ||||
|     public static final String ANDROID_MANIFEST = "AndroidManifest.xml"; | ||||
|  | ||||
|     public static final String SU_KEYSTORE_KEY = "su_key"; | ||||
|  | ||||
|     // Paths | ||||
|     public static final String MAGISK_PATH = "/sbin/.magisk/img"; | ||||
|     public static final File EXTERNAL_PATH; | ||||
|     public static File MAGISK_DISABLE_FILE; | ||||
|  | ||||
|     static { | ||||
|         MAGISK_DISABLE_FILE = new File("xxx"); | ||||
|         EXTERNAL_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); | ||||
|         EXTERNAL_PATH.mkdirs(); | ||||
|     } | ||||
|  | ||||
|     public static final String BUSYBOX_PATH = "/sbin/.magisk/busybox"; | ||||
|     public static final String TMP_FOLDER_PATH = "/dev/tmp"; | ||||
|     public static final String MAGISK_LOG = "/cache/magisk.log"; | ||||
|     public static final String MANAGER_CONFIGS = ".tmp.magisk.config"; | ||||
|  | ||||
|     // Versions | ||||
|     public static final int UPDATE_SERVICE_VER = 1; | ||||
|     public static final int MIN_MODULE_VER = 1500; | ||||
|     public static final int SNET_EXT_VER = 12; | ||||
|  | ||||
|     public static final int USER_ID = Process.myUid() / 100000; | ||||
|  | ||||
|     public static final class MAGISK_VER { | ||||
|         public static final int MIN_SUPPORT = 18000; | ||||
|     } | ||||
|  | ||||
|     public static class ID { | ||||
|         public static final int UPDATE_SERVICE_ID = 1; | ||||
|         public static final int FETCH_ZIP = 2; | ||||
|         public static final int SELECT_BOOT = 3; | ||||
|         public static final int ONBOOT_SERVICE_ID = 6; | ||||
|  | ||||
|         // notifications | ||||
|         public static final int MAGISK_UPDATE_NOTIFICATION_ID = 4; | ||||
|         public static final int APK_UPDATE_NOTIFICATION_ID = 5; | ||||
|         public static final int DTBO_NOTIFICATION_ID = 7; | ||||
|         public static final int HIDE_MANAGER_NOTIFICATION_ID = 8; | ||||
|         public static final String UPDATE_NOTIFICATION_CHANNEL = "update"; | ||||
|         public static final String PROGRESS_NOTIFICATION_CHANNEL = "progress"; | ||||
|         public static final String CHECK_MAGISK_UPDATE_WORKER_ID = "magisk_update"; | ||||
|     } | ||||
|  | ||||
|     public static class Url { | ||||
|         private static String getRaw(String where, String name) { | ||||
|             return String.format("https://raw.githubusercontent.com/topjohnwu/magisk_files/%s/%s", where, name); | ||||
|         } | ||||
|         public static final String STABLE_URL = getRaw("master", "stable.json"); | ||||
|         public static final String BETA_URL = getRaw("master", "beta.json"); | ||||
|         public static final String CANARY_URL = getRaw("master", "canary_builds/release.json"); | ||||
|         public static final String CANARY_DEBUG_URL = getRaw("master", "canary_builds/canary.json"); | ||||
|         public static final String REPO_URL = "https://api.github.com/users/Magisk-Modules-Repo/repos?per_page=100&sort=pushed&page=%d"; | ||||
|         public static final String FILE_URL = "https://raw.githubusercontent.com/Magisk-Modules-Repo/%s/master/%s"; | ||||
|         public static final String ZIP_URL = "https://github.com/Magisk-Modules-Repo/%s/archive/master.zip"; | ||||
|         public static final String MODULE_INSTALLER = "https://raw.githubusercontent.com/topjohnwu/Magisk/master/scripts/module_installer.sh"; | ||||
|         public static final String PAYPAL_URL = "https://www.paypal.me/topjohnwu"; | ||||
|         public static final String PATREON_URL = "https://www.patreon.com/topjohnwu"; | ||||
|         public static final String TWITTER_URL = "https://twitter.com/topjohnwu"; | ||||
|         public static final String XDA_THREAD = "http://forum.xda-developers.com/showthread.php?t=3432382"; | ||||
|         public static final String SOURCE_CODE_URL = "https://github.com/topjohnwu/Magisk"; | ||||
|         public static final String SNET_URL = getRaw("b66b1a914978e5f4c4bbfd74a59f4ad371bac107", "snet.apk"); | ||||
|         public static final String BOOTCTL_URL = getRaw("9c5dfc1b8245c0b5b524901ef0ff0f8335757b77", "bootctl"); | ||||
|     } | ||||
|  | ||||
|     public static class Key { | ||||
|         // others | ||||
|         public static final String LINK_KEY = "Link"; | ||||
|         public static final String IF_NONE_MATCH = "If-None-Match"; | ||||
|         // intents | ||||
|         public static final String FROM_SPLASH = "splash"; | ||||
|         public static final String OPEN_SECTION = "section"; | ||||
|         public static final String INTENT_SET_NAME = "filename"; | ||||
|         public static final String INTENT_SET_LINK = "link"; | ||||
|         public static final String FLASH_ACTION = "action"; | ||||
|         public static final String FLASH_SET_BOOT = "boot"; | ||||
|         public static final String BROADCAST_MANAGER_UPDATE = "manager_update"; | ||||
|         public static final String BROADCAST_REBOOT = "reboot"; | ||||
|     } | ||||
|  | ||||
|     public static class Value { | ||||
|         public static final String FLASH_ZIP = "flash"; | ||||
|         public static final String PATCH_BOOT = "patch"; | ||||
|         public static final String FLASH_MAGISK = "magisk"; | ||||
|         public static final String FLASH_INACTIVE_SLOT = "slot"; | ||||
|         public static final String UNINSTALL = "uninstall"; | ||||
|     } | ||||
|  | ||||
|  | ||||
| } | ||||
							
								
								
									
										271
									
								
								app/src/main/java/com/topjohnwu/magisk/FlashActivity.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								app/src/main/java/com/topjohnwu/magisk/FlashActivity.java
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,39 +1,45 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.content.Intent; | ||||
| import android.os.Build; | ||||
| import android.os.Bundle; | ||||
| import android.os.Handler; | ||||
| import android.support.annotation.NonNull; | ||||
| import android.support.design.widget.NavigationView; | ||||
| import android.support.v4.app.ActivityCompat; | ||||
| import android.support.v4.app.Fragment; | ||||
| import android.support.v4.app.FragmentTransaction; | ||||
| import android.support.v4.widget.DrawerLayout; | ||||
| import android.support.v7.app.ActionBarDrawerToggle; | ||||
| import android.support.v7.widget.Toolbar; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.Activity; | ||||
| import com.topjohnwu.magisk.utils.Const; | ||||
| import com.topjohnwu.magisk.utils.Topic; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.appcompat.app.ActionBarDrawerToggle; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
| import androidx.drawerlayout.widget.DrawerLayout; | ||||
| import androidx.fragment.app.Fragment; | ||||
| import androidx.fragment.app.FragmentTransaction; | ||||
|  | ||||
| import com.google.android.material.navigation.NavigationView; | ||||
| import com.topjohnwu.magisk.components.BaseActivity; | ||||
| import com.topjohnwu.magisk.fragments.LogFragment; | ||||
| import com.topjohnwu.magisk.fragments.MagiskFragment; | ||||
| import com.topjohnwu.magisk.fragments.MagiskHideFragment; | ||||
| import com.topjohnwu.magisk.fragments.ModulesFragment; | ||||
| import com.topjohnwu.magisk.fragments.ReposFragment; | ||||
| import com.topjohnwu.magisk.fragments.SettingsFragment; | ||||
| import com.topjohnwu.magisk.fragments.SuperuserFragment; | ||||
| import com.topjohnwu.magisk.utils.Utils; | ||||
| import com.topjohnwu.net.Networking; | ||||
| import com.topjohnwu.superuser.Shell; | ||||
|  | ||||
| import butterknife.BindView; | ||||
| import butterknife.ButterKnife; | ||||
|  | ||||
| public class MainActivity extends Activity | ||||
|         implements NavigationView.OnNavigationItemSelectedListener, Topic.Subscriber { | ||||
| public class MainActivity extends BaseActivity | ||||
|         implements NavigationView.OnNavigationItemSelectedListener { | ||||
|  | ||||
|     private final Handler mDrawerHandler = new Handler(); | ||||
|     private int mDrawerItem; | ||||
|     private boolean fromShortcut = true; | ||||
|     private static boolean fromShortcut = false; | ||||
|  | ||||
|     @BindView(R.id.toolbar) Toolbar toolbar; | ||||
|     @BindView(R.id.toolbar) public Toolbar toolbar; | ||||
|     @BindView(R.id.drawer_layout) DrawerLayout drawer; | ||||
|     @BindView(R.id.nav_view) public NavigationView navigationView; | ||||
|     @BindView(R.id.nav_view) NavigationView navigationView; | ||||
|  | ||||
|     private float toolbarElevation; | ||||
|  | ||||
| @@ -44,28 +50,15 @@ public class MainActivity extends Activity | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(final Bundle savedInstanceState) { | ||||
|  | ||||
|         MagiskManager mm = getMagiskManager(); | ||||
|  | ||||
|         if (!mm.hasInit) { | ||||
|             Intent intent = new Intent(this, SplashActivity.class); | ||||
|             String section = getIntent().getStringExtra(Const.Key.OPEN_SECTION); | ||||
|             if (section != null) { | ||||
|                 intent.putExtra(Const.Key.OPEN_SECTION, section); | ||||
|             } | ||||
|             startActivity(intent); | ||||
|         if (!getIntent().getBooleanExtra(Const.Key.FROM_SPLASH, false)) { | ||||
|             startActivity(new Intent(this, ClassMap.get(SplashActivity.class))); | ||||
|             finish(); | ||||
|         } | ||||
|  | ||||
|         String perm = getIntent().getStringExtra(Const.Key.INTENT_PERM); | ||||
|         if (perm != null) { | ||||
|             ActivityCompat.requestPermissions(this, new String[] { perm }, 0); | ||||
|         } | ||||
|  | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_main); | ||||
|         ButterKnife.bind(this); | ||||
|  | ||||
|         new MainActivity_ViewBinding(this); | ||||
|         checkHideSection(); | ||||
|         setSupportActionBar(toolbar); | ||||
|  | ||||
|         ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.magisk, R.string.magisk) { | ||||
| @@ -81,23 +74,22 @@ public class MainActivity extends Activity | ||||
|             } | ||||
|         }; | ||||
|  | ||||
|         toolbarElevation = toolbar.getElevation(); | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||
|             toolbarElevation = toolbar.getElevation(); | ||||
|         } | ||||
|  | ||||
|         drawer.addDrawerListener(toggle); | ||||
|         toggle.syncState(); | ||||
|  | ||||
|         if (savedInstanceState == null) | ||||
|             navigate(getIntent().getStringExtra(Const.Key.OPEN_SECTION)); | ||||
|         if (savedInstanceState == null) { | ||||
|             String section = getIntent().getStringExtra(Const.Key.OPEN_SECTION); | ||||
|             fromShortcut = section != null; | ||||
|             navigate(section); | ||||
|         } | ||||
|  | ||||
|         navigationView.setNavigationItemSelectedListener(this); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onResume() { | ||||
|         super.onResume(); | ||||
|         checkHideSection(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onBackPressed() { | ||||
|         if (drawer.isDrawerOpen(navigationView)) { | ||||
| @@ -117,29 +109,15 @@ public class MainActivity extends Activity | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onTopicPublished(Topic topic) { | ||||
|         recreate(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Topic[] getSubscription() { | ||||
|         return new Topic[] { getMagiskManager().reloadActivity }; | ||||
|     } | ||||
|  | ||||
|     public void checkHideSection() { | ||||
|         MagiskManager mm = getMagiskManager(); | ||||
|         Menu menu = navigationView.getMenu(); | ||||
|         menu.findItem(R.id.magiskhide).setVisible( | ||||
|                 Shell.rootAccess() && mm.magiskVersionCode >= Const.MAGISK_VER.UNIFIED | ||||
|                         && mm.prefs.getBoolean(Const.Key.MAGISKHIDE, false)); | ||||
|         menu.findItem(R.id.modules).setVisible(!mm.prefs.getBoolean(Const.Key.COREONLY, false) && | ||||
|                 Shell.rootAccess() && mm.magiskVersionCode >= 0); | ||||
|         menu.findItem(R.id.downloads).setVisible(!mm.prefs.getBoolean(Const.Key.COREONLY, false) | ||||
|                 && Utils.checkNetworkStatus() && Shell.rootAccess() && mm.magiskVersionCode >= 0); | ||||
|         menu.findItem(R.id.magiskhide).setVisible(Shell.rootAccess() && | ||||
|                 (boolean) Config.get(Config.Key.MAGISKHIDE)); | ||||
|         menu.findItem(R.id.modules).setVisible(Shell.rootAccess() && Config.magiskVersionCode >= 0); | ||||
|         menu.findItem(R.id.downloads).setVisible(Networking.checkNetworkStatus(this) | ||||
|                 && Shell.rootAccess() && Config.magiskVersionCode >= 0); | ||||
|         menu.findItem(R.id.log).setVisible(Shell.rootAccess()); | ||||
|         menu.findItem(R.id.superuser).setVisible(Shell.rootAccess() && | ||||
|                 !(Const.USER_ID > 0 && mm.multiuserMode == Const.Value.MULTIUSER_MODE_OWNER_MANAGED)); | ||||
|         menu.findItem(R.id.superuser).setVisible(Utils.showSuperUser()); | ||||
|     } | ||||
|  | ||||
|     public void navigate(String item) { | ||||
| @@ -164,16 +142,12 @@ public class MainActivity extends Activity | ||||
|                 case "settings": | ||||
|                     itemId = R.id.settings; | ||||
|                     break; | ||||
|                 case "about": | ||||
|                     itemId = R.id.app_about; | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|         navigate(itemId); | ||||
|     } | ||||
|  | ||||
|     public void navigate(int itemId) { | ||||
|         int bak = mDrawerItem; | ||||
|         mDrawerItem = itemId; | ||||
|         navigationView.setCheckedItem(itemId); | ||||
|         switch (itemId) { | ||||
| @@ -197,12 +171,7 @@ public class MainActivity extends Activity | ||||
|                 displayFragment(new LogFragment(), false); | ||||
|                 break; | ||||
|             case R.id.settings: | ||||
|                 startActivity(new Intent(this, SettingsActivity.class)); | ||||
|                 mDrawerItem = bak; | ||||
|                 break; | ||||
|             case R.id.app_about: | ||||
|                 startActivity(new Intent(this, AboutActivity.class)); | ||||
|                 mDrawerItem = bak; | ||||
|                 displayFragment(new SettingsFragment(), true); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
| @@ -214,6 +183,8 @@ public class MainActivity extends Activity | ||||
|                 .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) | ||||
|                 .replace(R.id.content_frame, navFragment) | ||||
|                 .commitNow(); | ||||
|         toolbar.setElevation(setElevation ? toolbarElevation : 0); | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | ||||
|             toolbar.setElevation(setElevation ? toolbarElevation : 0); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										89
									
								
								app/src/main/java/com/topjohnwu/magisk/SplashActivity.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								app/src/main/java/com/topjohnwu/magisk/SplashActivity.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | ||||
| package com.topjohnwu.magisk; | ||||
|  | ||||
| import android.content.Intent; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.os.Bundle; | ||||
| import android.text.TextUtils; | ||||
|  | ||||
| import androidx.appcompat.app.AlertDialog; | ||||
|  | ||||
| import com.topjohnwu.magisk.components.BaseActivity; | ||||
| import com.topjohnwu.magisk.database.RepoDatabaseHelper; | ||||
| import com.topjohnwu.magisk.tasks.UpdateRepos; | ||||
| import com.topjohnwu.magisk.uicomponents.Notifications; | ||||
| import com.topjohnwu.magisk.uicomponents.Shortcuts; | ||||
| import com.topjohnwu.magisk.utils.LocaleManager; | ||||
| import com.topjohnwu.magisk.utils.Utils; | ||||
| import com.topjohnwu.net.Networking; | ||||
| import com.topjohnwu.superuser.Shell; | ||||
|  | ||||
| public class SplashActivity extends BaseActivity { | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|  | ||||
|         Shell.getShell(shell -> { | ||||
|             if (Config.magiskVersionCode > 0 && | ||||
|                     Config.magiskVersionCode < Const.MAGISK_VER.MIN_SUPPORT) { | ||||
|                 new AlertDialog.Builder(this) | ||||
|                         .setTitle(R.string.unsupport_magisk_title) | ||||
|                         .setMessage(R.string.unsupport_magisk_message) | ||||
|                         .setNegativeButton(R.string.ok, null) | ||||
|                         .setOnDismissListener(dialog -> finish()) | ||||
|                         .show(); | ||||
|             } else { | ||||
|                 initAndStart(); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     private void initAndStart() { | ||||
|         String pkg = Config.get(Config.Key.SU_MANAGER); | ||||
|         if (pkg != null && getPackageName().equals(BuildConfig.APPLICATION_ID)) { | ||||
|             Config.remove(Config.Key.SU_MANAGER); | ||||
|             Shell.su("pm uninstall " + pkg).submit(); | ||||
|         } | ||||
|         if (TextUtils.equals(pkg, getPackageName())) { | ||||
|             try { | ||||
|                 // We are the manager, remove com.topjohnwu.magisk as it could be malware | ||||
|                 getPackageManager().getApplicationInfo(BuildConfig.APPLICATION_ID, 0); | ||||
|                 Shell.su("pm uninstall " + BuildConfig.APPLICATION_ID).submit(); | ||||
|             } catch (PackageManager.NameNotFoundException ignored) {} | ||||
|         } | ||||
|  | ||||
|         // Dynamic detect all locales | ||||
|         LocaleManager.loadAvailableLocales(R.string.app_changelog); | ||||
|  | ||||
|         // Set default configs | ||||
|         Config.initialize(); | ||||
|  | ||||
|         // Create notification channel on Android O | ||||
|         Notifications.setup(this); | ||||
|  | ||||
|         // Schedule periodic update checks | ||||
|         Utils.scheduleUpdateCheck(); | ||||
|  | ||||
|         // Setup shortcuts | ||||
|         Shortcuts.setup(this); | ||||
|  | ||||
|         // Create repo database | ||||
|         app.repoDB = new RepoDatabaseHelper(this); | ||||
|  | ||||
|         // Magisk working as expected | ||||
|         if (Shell.rootAccess() && Config.magiskVersionCode > 0) { | ||||
|             // Load modules | ||||
|             Utils.loadModules(false); | ||||
|             // Load repos | ||||
|             if (Networking.checkNetworkStatus(this)) | ||||
|                 new UpdateRepos().exec(); | ||||
|         } | ||||
|  | ||||
|         Intent intent = new Intent(this, ClassMap.get(MainActivity.class)); | ||||
|         intent.putExtra(Const.Key.OPEN_SECTION, getIntent().getStringExtra(Const.Key.OPEN_SECTION)); | ||||
|         intent.putExtra(Const.Key.FROM_SPLASH, true); | ||||
|         intent.putExtra(BaseActivity.INTENT_PERM, getIntent().getStringExtra(BaseActivity.INTENT_PERM)); | ||||
|         startActivity(intent); | ||||
|         finish(); | ||||
|     } | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,8 +1,6 @@ | ||||
| package com.topjohnwu.magisk.adapters; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.support.design.widget.Snackbar; | ||||
| import android.support.v7.widget.RecyclerView; | ||||
| import android.text.TextUtils; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.View; | ||||
| @@ -11,15 +9,18 @@ import android.widget.CheckBox; | ||||
| import android.widget.ImageView; | ||||
| import android.widget.TextView; | ||||
|  | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
|  | ||||
| import com.google.android.material.snackbar.Snackbar; | ||||
| import com.topjohnwu.magisk.R; | ||||
| import com.topjohnwu.magisk.components.SnackbarMaker; | ||||
| import com.topjohnwu.magisk.container.Module; | ||||
| import com.topjohnwu.magisk.uicomponents.SnackbarMaker; | ||||
| import com.topjohnwu.superuser.Shell; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import butterknife.BindView; | ||||
| import butterknife.ButterKnife; | ||||
|  | ||||
| public class ModulesAdapter extends RecyclerView.Adapter<ModulesAdapter.ViewHolder> { | ||||
|  | ||||
| @@ -29,6 +30,7 @@ public class ModulesAdapter extends RecyclerView.Adapter<ModulesAdapter.ViewHold | ||||
|         mList = list; | ||||
|     } | ||||
|  | ||||
|     @NonNull | ||||
|     @Override | ||||
|     public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | ||||
|         View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_module, parent, false); | ||||
| @@ -46,9 +48,9 @@ public class ModulesAdapter extends RecyclerView.Adapter<ModulesAdapter.ViewHold | ||||
|         String noInfo = context.getString(R.string.no_info_provided); | ||||
|  | ||||
|         holder.title.setText(module.getName()); | ||||
|         holder.versionName.setText( TextUtils.isEmpty(version) ? noInfo : version); | ||||
|         holder.author.setText( TextUtils.isEmpty(author) ? noInfo : context.getString(R.string.author, author)); | ||||
|         holder.description.setText( TextUtils.isEmpty(description) ? noInfo : description); | ||||
|         holder.versionName.setText(TextUtils.isEmpty(version) ? noInfo : version); | ||||
|         holder.author.setText(TextUtils.isEmpty(author) ? noInfo : context.getString(R.string.author, author)); | ||||
|         holder.description.setText(TextUtils.isEmpty(description) ? noInfo : description); | ||||
|  | ||||
|         holder.checkBox.setOnCheckedChangeListener(null); | ||||
|         holder.checkBox.setChecked(module.isEnabled()); | ||||
| @@ -114,7 +116,7 @@ public class ModulesAdapter extends RecyclerView.Adapter<ModulesAdapter.ViewHold | ||||
|  | ||||
|         ViewHolder(View itemView) { | ||||
|             super(itemView); | ||||
|             ButterKnife.bind(this, itemView); | ||||
|             new ModulesAdapter$ViewHolder_ViewBinding(this, itemView); | ||||
|  | ||||
|             if (!Shell.rootAccess()) { | ||||
|                 checkBox.setEnabled(false); | ||||
| @@ -0,0 +1,172 @@ | ||||
| package com.topjohnwu.magisk.adapters; | ||||
|  | ||||
| import android.app.Activity; | ||||
| import android.content.DialogInterface; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.ImageView; | ||||
| import android.widget.TextView; | ||||
|  | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.appcompat.widget.SwitchCompat; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
|  | ||||
| import com.google.android.material.snackbar.Snackbar; | ||||
| import com.topjohnwu.magisk.R; | ||||
| import com.topjohnwu.magisk.container.Policy; | ||||
| import com.topjohnwu.magisk.database.MagiskDB; | ||||
| import com.topjohnwu.magisk.dialogs.CustomAlertDialog; | ||||
| import com.topjohnwu.magisk.dialogs.FingerprintAuthDialog; | ||||
| import com.topjohnwu.magisk.uicomponents.ArrowExpandable; | ||||
| import com.topjohnwu.magisk.uicomponents.Expandable; | ||||
| import com.topjohnwu.magisk.uicomponents.ExpandableViewHolder; | ||||
| import com.topjohnwu.magisk.uicomponents.SnackbarMaker; | ||||
| import com.topjohnwu.magisk.utils.FingerprintHelper; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| import butterknife.BindView; | ||||
|  | ||||
| public class PolicyAdapter extends RecyclerView.Adapter<PolicyAdapter.ViewHolder> { | ||||
|  | ||||
|     private List<Policy> policyList; | ||||
|     private MagiskDB dbHelper; | ||||
|     private PackageManager pm; | ||||
|     private boolean[] expandList; | ||||
|  | ||||
|     public PolicyAdapter(List<Policy> list, MagiskDB db, PackageManager pm) { | ||||
|         policyList = list; | ||||
|         expandList = new boolean[policyList.size()]; | ||||
|         dbHelper = db; | ||||
|         this.pm = pm; | ||||
|     } | ||||
|  | ||||
|     @NonNull | ||||
|     @Override | ||||
|     public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | ||||
|         View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_policy, parent, false); | ||||
|         return new ViewHolder(v); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onBindViewHolder(@NonNull ViewHolder holder, int position) { | ||||
|         Policy policy = policyList.get(position); | ||||
|  | ||||
|         holder.settings.setExpanded(expandList[position]); | ||||
|         holder.trigger.setOnClickListener(view -> { | ||||
|             if (holder.settings.isExpanded()) { | ||||
|                 holder.settings.collapse(); | ||||
|                 expandList[position] = false; | ||||
|             } else { | ||||
|                 holder.settings.expand(); | ||||
|                 expandList[position] = true; | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         holder.appName.setText(policy.appName); | ||||
|         holder.packageName.setText(policy.packageName); | ||||
|         holder.appIcon.setImageDrawable(policy.info.loadIcon(pm)); | ||||
|  | ||||
|         holder.notificationSwitch.setOnCheckedChangeListener(null); | ||||
|         holder.loggingSwitch.setOnCheckedChangeListener(null); | ||||
|  | ||||
|         holder.masterSwitch.setChecked(policy.policy == Policy.ALLOW); | ||||
|         holder.notificationSwitch.setChecked(policy.notification); | ||||
|         holder.loggingSwitch.setChecked(policy.logging); | ||||
|  | ||||
|         holder.masterSwitch.setOnClickListener(v -> { | ||||
|             boolean isChecked = holder.masterSwitch.isChecked(); | ||||
|             Runnable r = () -> { | ||||
|                 if ((isChecked && policy.policy == Policy.DENY) || | ||||
|                         (!isChecked && policy.policy == Policy.ALLOW)) { | ||||
|                     policy.policy = isChecked ? Policy.ALLOW : Policy.DENY; | ||||
|                     String message = v.getContext().getString( | ||||
|                             isChecked ? R.string.su_snack_grant : R.string.su_snack_deny, policy.appName); | ||||
|                     SnackbarMaker.make(holder.itemView, message, Snackbar.LENGTH_SHORT).show(); | ||||
|                     dbHelper.updatePolicy(policy); | ||||
|                 } | ||||
|             }; | ||||
|             if (FingerprintHelper.useFingerprint()) { | ||||
|                 holder.masterSwitch.setChecked(!isChecked); | ||||
|                 new FingerprintAuthDialog((Activity) v.getContext(), () -> { | ||||
|                     holder.masterSwitch.setChecked(isChecked); | ||||
|                     r.run(); | ||||
|                 }).show(); | ||||
|             } else { | ||||
|                 r.run(); | ||||
|             } | ||||
|         }); | ||||
|         holder.notificationSwitch.setOnCheckedChangeListener((v, isChecked) -> { | ||||
|             if ((isChecked && !policy.notification) || | ||||
|                     (!isChecked && policy.notification)) { | ||||
|                 policy.notification = isChecked; | ||||
|                 String message = v.getContext().getString( | ||||
|                         isChecked ? R.string.su_snack_notif_on : R.string.su_snack_notif_off, policy.appName); | ||||
|                 SnackbarMaker.make(holder.itemView, message, Snackbar.LENGTH_SHORT).show(); | ||||
|                 dbHelper.updatePolicy(policy); | ||||
|             } | ||||
|         }); | ||||
|         holder.loggingSwitch.setOnCheckedChangeListener((v, isChecked) -> { | ||||
|             if ((isChecked && !policy.logging) || | ||||
|                     (!isChecked && policy.logging)) { | ||||
|                 policy.logging = isChecked; | ||||
|                 String message = v.getContext().getString( | ||||
|                         isChecked ? R.string.su_snack_log_on : R.string.su_snack_log_off, policy.appName); | ||||
|                 SnackbarMaker.make(holder.itemView, message, Snackbar.LENGTH_SHORT).show(); | ||||
|                 dbHelper.updatePolicy(policy); | ||||
|             } | ||||
|         }); | ||||
|         holder.delete.setOnClickListener(v -> { | ||||
|             DialogInterface.OnClickListener l = (dialog, which) -> { | ||||
|                 policyList.remove(position); | ||||
|                 notifyItemRemoved(position); | ||||
|                 notifyItemRangeChanged(position, policyList.size()); | ||||
|                 SnackbarMaker.make(holder.itemView, v.getContext().getString(R.string.su_snack_revoke, policy.appName), | ||||
|                         Snackbar.LENGTH_SHORT).show(); | ||||
|                 dbHelper.deletePolicy(policy); | ||||
|             }; | ||||
|             if (FingerprintHelper.useFingerprint()) { | ||||
|                 new FingerprintAuthDialog((Activity) v.getContext(), | ||||
|                         () -> l.onClick(null, 0)).show(); | ||||
|             } else { | ||||
|                 new CustomAlertDialog((Activity) v.getContext()) | ||||
|                         .setTitle(R.string.su_revoke_title) | ||||
|                         .setMessage(v.getContext().getString(R.string.su_revoke_msg, policy.appName)) | ||||
|                         .setPositiveButton(R.string.yes, l) | ||||
|                         .setNegativeButton(R.string.no_thanks, null) | ||||
|                         .setCancelable(true) | ||||
|                         .show(); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int getItemCount() { | ||||
|         return policyList.size(); | ||||
|     } | ||||
|  | ||||
|     static class ViewHolder extends RecyclerView.ViewHolder { | ||||
|  | ||||
|         @BindView(R.id.app_name) TextView appName; | ||||
|         @BindView(R.id.package_name) TextView packageName; | ||||
|         @BindView(R.id.app_icon) ImageView appIcon; | ||||
|         @BindView(R.id.master_switch) SwitchCompat masterSwitch; | ||||
|         @BindView(R.id.notification_switch) SwitchCompat notificationSwitch; | ||||
|         @BindView(R.id.logging_switch) SwitchCompat loggingSwitch; | ||||
|         @BindView(R.id.expand_layout) ViewGroup expandLayout; | ||||
|         @BindView(R.id.arrow) ImageView arrow; | ||||
|         @BindView(R.id.trigger) View trigger; | ||||
|         @BindView(R.id.delete) ImageView delete; | ||||
|         @BindView(R.id.more_info) ImageView moreInfo; | ||||
|  | ||||
|         Expandable settings; | ||||
|  | ||||
|         public ViewHolder(View itemView) { | ||||
|             super(itemView); | ||||
|             new PolicyAdapter$ViewHolder_ViewBinding(this, itemView); | ||||
|             settings = new ArrowExpandable(new ExpandableViewHolder(expandLayout), arrow); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,246 @@ | ||||
| package com.topjohnwu.magisk.adapters; | ||||
|  | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.database.Cursor; | ||||
| import android.os.Build; | ||||
| import android.text.TextUtils; | ||||
| import android.util.Pair; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.ImageView; | ||||
| import android.widget.SearchView; | ||||
| import android.widget.TextView; | ||||
|  | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
|  | ||||
| import com.topjohnwu.magisk.App; | ||||
| import com.topjohnwu.magisk.ClassMap; | ||||
| import com.topjohnwu.magisk.R; | ||||
| import com.topjohnwu.magisk.components.BaseActivity; | ||||
| import com.topjohnwu.magisk.components.DownloadModuleService; | ||||
| import com.topjohnwu.magisk.container.Module; | ||||
| import com.topjohnwu.magisk.container.Repo; | ||||
| import com.topjohnwu.magisk.database.RepoDatabaseHelper; | ||||
| import com.topjohnwu.magisk.dialogs.CustomAlertDialog; | ||||
| import com.topjohnwu.magisk.uicomponents.MarkDownWindow; | ||||
| import com.topjohnwu.magisk.utils.Event; | ||||
|  | ||||
| import java.util.ArrayList; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| import butterknife.BindView; | ||||
| import java9.util.stream.StreamSupport; | ||||
|  | ||||
| public class ReposAdapter | ||||
|         extends SectionedAdapter<ReposAdapter.SectionHolder, ReposAdapter.RepoHolder> | ||||
|         implements Event.AutoListener, SearchView.OnQueryTextListener { | ||||
|  | ||||
|     private static final int UPDATES = 0; | ||||
|     private static final int INSTALLED = 1; | ||||
|     private static final int OTHERS = 2; | ||||
|  | ||||
|     private Map<String, Module> moduleMap; | ||||
|     private RepoDatabaseHelper repoDB; | ||||
|     private List<Pair<Integer, List<Repo>>> repoPairs; | ||||
|     private List<Repo> fullList; | ||||
|     private SearchView mSearch; | ||||
|  | ||||
|     public ReposAdapter() { | ||||
|         repoDB = App.self.repoDB; | ||||
|         moduleMap = Collections.emptyMap(); | ||||
|         fullList = Collections.emptyList(); | ||||
|         repoPairs = new ArrayList<>(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int getSectionCount() { | ||||
|         return repoPairs.size(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int getItemCount(int section) { | ||||
|         return repoPairs.get(section).second.size(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public SectionHolder onCreateSectionViewHolder(ViewGroup parent) { | ||||
|         View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.section, parent, false); | ||||
|         return new SectionHolder(v); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public RepoHolder onCreateItemViewHolder(ViewGroup parent, int viewType) { | ||||
|         View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_repo, parent, false); | ||||
|         return new RepoHolder(v); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onBindSectionViewHolder(SectionHolder holder, int section) { | ||||
|         switch (repoPairs.get(section).first) { | ||||
|             case UPDATES: | ||||
|                 holder.sectionText.setText(R.string.update_available); | ||||
|                 break; | ||||
|             case INSTALLED: | ||||
|                 holder.sectionText.setText(R.string.installed); | ||||
|                 break; | ||||
|             case OTHERS: | ||||
|                 holder.sectionText.setText(R.string.not_installed); | ||||
|                 break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onBindItemViewHolder(RepoHolder holder, int section, int position) { | ||||
|         Repo repo = repoPairs.get(section).second.get(position); | ||||
|         Context context = holder.itemView.getContext(); | ||||
|  | ||||
|         String name = repo.getName(); | ||||
|         String version = repo.getVersion(); | ||||
|         String author = repo.getAuthor(); | ||||
|         String description = repo.getDescription(); | ||||
|         String noInfo = context.getString(R.string.no_info_provided); | ||||
|  | ||||
|         holder.title.setText(TextUtils.isEmpty(name) ? noInfo : name); | ||||
|         holder.versionName.setText(TextUtils.isEmpty(version) ? noInfo : version); | ||||
|         holder.author.setText(TextUtils.isEmpty(author) ? noInfo : context.getString(R.string.author, author)); | ||||
|         holder.description.setText(TextUtils.isEmpty(description) ? noInfo : description); | ||||
|         holder.updateTime.setText(context.getString(R.string.updated_on, repo.getLastUpdateString())); | ||||
|  | ||||
|         holder.infoLayout.setOnClickListener(v -> | ||||
|                 MarkDownWindow.show((BaseActivity) context, null, repo.getDetailUrl())); | ||||
|  | ||||
|         holder.downloadImage.setOnClickListener(v -> { | ||||
|             new CustomAlertDialog((BaseActivity) context) | ||||
|                 .setTitle(context.getString(R.string.repo_install_title, repo.getName())) | ||||
|                 .setMessage(context.getString(R.string.repo_install_msg, repo.getDownloadFilename())) | ||||
|                 .setCancelable(true) | ||||
|                 .setPositiveButton(R.string.install, (d, i) -> | ||||
|                         startDownload((BaseActivity) context, repo, true)) | ||||
|                 .setNeutralButton(R.string.download, (d, i) -> | ||||
|                         startDownload((BaseActivity) context, repo, false)) | ||||
|                 .setNegativeButton(R.string.no_thanks, null) | ||||
|                 .show(); | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     private void startDownload(BaseActivity activity, Repo repo, Boolean install) { | ||||
|         activity.runWithExternalRW(() -> { | ||||
|             Intent intent = new Intent(activity, ClassMap.get(DownloadModuleService.class)) | ||||
|                     .putExtra("repo", repo).putExtra("install", install); | ||||
|             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | ||||
|                 activity.startForegroundService(intent); | ||||
|             } else { | ||||
|                 activity.startService(intent); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     private void updateLists() { | ||||
|         if (mSearch != null) | ||||
|             onQueryTextChange(mSearch.getQuery().toString()); | ||||
|         else | ||||
|             onQueryTextChange(""); | ||||
|     } | ||||
|  | ||||
|     private static boolean noCaseContain(String a, String b) { | ||||
|         return a.toLowerCase().contains(b.toLowerCase()); | ||||
|     } | ||||
|  | ||||
|     public void setSearchView(SearchView view) { | ||||
|         mSearch = view; | ||||
|         mSearch.setOnQueryTextListener(this); | ||||
|     } | ||||
|  | ||||
|     public void notifyDBChanged(boolean refresh) { | ||||
|         try (Cursor c = repoDB.getRepoCursor()) { | ||||
|             fullList = new ArrayList<>(c.getCount()); | ||||
|             while (c.moveToNext()) | ||||
|                 fullList.add(new Repo(c)); | ||||
|         } | ||||
|         if (refresh) | ||||
|             updateLists(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onEvent(int event) { | ||||
|         moduleMap = Event.getResult(event); | ||||
|         updateLists(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int[] getListeningEvents() { | ||||
|         return new int[] {Event.MODULE_LOAD_DONE}; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onQueryTextSubmit(String query) { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onQueryTextChange(String s) { | ||||
|         List<Repo> updates = new ArrayList<>(); | ||||
|         List<Repo> installed = new ArrayList<>(); | ||||
|         List<Repo> others = new ArrayList<>(); | ||||
|  | ||||
|         StreamSupport.stream(fullList) | ||||
|                 .filter(repo -> noCaseContain(repo.getName(), s) | ||||
|                         || noCaseContain(repo.getAuthor(), s) | ||||
|                         || noCaseContain(repo.getDescription(), s)) | ||||
|                 .forEach(repo -> { | ||||
|                     Module module = moduleMap.get(repo.getId()); | ||||
|                     if (module != null) { | ||||
|                         if (repo.getVersionCode() > module.getVersionCode()) { | ||||
|                             // Updates | ||||
|                             updates.add(repo); | ||||
|                         } else { | ||||
|                             installed.add(repo); | ||||
|                         } | ||||
|                     } else { | ||||
|                         others.add(repo); | ||||
|                     } | ||||
|                 }); | ||||
|  | ||||
|         repoPairs.clear(); | ||||
|         if (!updates.isEmpty()) | ||||
|             repoPairs.add(new Pair<>(UPDATES, updates)); | ||||
|         if (!installed.isEmpty()) | ||||
|             repoPairs.add(new Pair<>(INSTALLED, installed)); | ||||
|         if (!others.isEmpty()) | ||||
|             repoPairs.add(new Pair<>(OTHERS, others)); | ||||
|  | ||||
|         notifyDataSetChanged(); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     static class SectionHolder extends RecyclerView.ViewHolder { | ||||
|  | ||||
|         @BindView(R.id.section_text) TextView sectionText; | ||||
|  | ||||
|         SectionHolder(View itemView) { | ||||
|             super(itemView); | ||||
|             new ReposAdapter$SectionHolder_ViewBinding(this, itemView); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static class RepoHolder extends RecyclerView.ViewHolder { | ||||
|  | ||||
|         @BindView(R.id.title) TextView title; | ||||
|         @BindView(R.id.version_name) TextView versionName; | ||||
|         @BindView(R.id.description) TextView description; | ||||
|         @BindView(R.id.author) TextView author; | ||||
|         @BindView(R.id.info_layout) View infoLayout; | ||||
|         @BindView(R.id.download) ImageView downloadImage; | ||||
|         @BindView(R.id.update_time) TextView updateTime; | ||||
|  | ||||
|         RepoHolder(View itemView) { | ||||
|             super(itemView); | ||||
|             new ReposAdapter$RepoHolder_ViewBinding(this, itemView); | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user