From 2eca6576a26e22f57ee82edb76da0b97ebbbe242 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Tue, 5 Aug 2025 01:48:19 +0200 Subject: [PATCH] added deep link for custom buttons --- android/app/src/main/AndroidManifest.xml | 6 ++ assets/mangayomi_mpv.zip | Bin 1192859 -> 1194808 bytes lib/l10n/app_en.arb | 1 + lib/l10n/generated/app_localizations.dart | 6 ++ lib/l10n/generated/app_localizations_ar.dart | 3 + lib/l10n/generated/app_localizations_as.dart | 3 + lib/l10n/generated/app_localizations_de.dart | 3 + lib/l10n/generated/app_localizations_en.dart | 3 + lib/l10n/generated/app_localizations_es.dart | 3 + lib/l10n/generated/app_localizations_fr.dart | 3 + lib/l10n/generated/app_localizations_hi.dart | 3 + lib/l10n/generated/app_localizations_id.dart | 3 + lib/l10n/generated/app_localizations_it.dart | 3 + lib/l10n/generated/app_localizations_pt.dart | 3 + lib/l10n/generated/app_localizations_ru.dart | 3 + lib/l10n/generated/app_localizations_th.dart | 3 + lib/l10n/generated/app_localizations_tr.dart | 3 + lib/l10n/generated/app_localizations_zh.dart | 3 + lib/main.dart | 59 ++++++++++++++++++- pubspec.lock | 16 ++--- 20 files changed, 121 insertions(+), 9 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7e342774..1055afb4 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -36,6 +36,12 @@ + + + + + + Yo`%tt<#_p~p%TuSylBI!Efgf*dINan(2$#X%-zo|Jk(3HAifh=7D&M~aC_MA&nA~-RX66xRzAzuGt{ESG{&j4}$bA8!-;Dm) zYs##3e3MIg4in9eb%0DpO3Vpi_!5sUmR)DkuIAYmVIyho}&BjUNygK6aK`l#=(V5nYLFw zl$HFgO$o7)>bn#0pT`CA)dY4<&mHRwzau7`qI)LtLcyf)U?u0P?AWdgJ@pqkQO6gp zT3nk|%Or-kh8vyheO458ZTl6TbFZiIjjg$d%qLwucf^UFbFI@+3<^loYm;dVwa{lx zNX^Py)Y(ZUi8vd@|0^?FjA7^_B=*?jKYb(eY5oW5#tbDF_kHQCSiUsoPqpDSrAwZ~ z2@suo;&D4ZgehgUa4cNq^SWanU6tIcn!I(-*h}JXA@kpUaH1lk=8@o`>I5Ro^7w>q z_6on-+4JQesq4G+ccoF#v!Oa>v_E<9S@P90H{7*7qjp%PKRHu6 zHKQ0eTVgfTUtox=zi^@YvB%WxrD4B{cX9rkVqX+Bw3AnRZ1Q(;d^K+y%!ZAoS&pSi zW#>s$P(#DxFIJz7lhn9(sN;nod&6z3qCC;q1&8Pfp`vX{8m=|btAbvC1W*R@iFyUg zExjO$ZKN1G`)YTAZSc$M9fItI#ttgIc-HI3$Ir9hZb(m$A5`n6@F& z@R?rZ)h*+=x*BE8C!9}mz?b9!$r#I^c^f}jh-uj-M?08UV zcUVr%A#tZevN^2U`?8=_hr>wAq1N?R_-UeL~$Ksg=R=ph7p*U)rj%Ickqw<5Z zg17bHBa4I`W2V)b@g1d2#(Z5}mDfUN>eV0W(4EeVJ#|pKckPLG@ud#<^^npBr=0vxifT!$I>0|Q?(+rZTV%R#unm3 zwg-;-P?*zpRv)SUP1MG6@~!ig?SH1ENo^`LN}jQk^ir!~m?SjPl-n0)%wu0D3iwvY z22AbB`}s>E&$fzm{Qmy*o$-V7-wYlcv0z`~|6(yXoL)Y@8qetxN*|80ow%c~q2@en zm1EjNX$*Yinb0lrCcU)JO1{Q2-n8};OXaqz;7jf5V)C~2<;2rIdKaDktm-HZ(DxmW zk)+g=e)~FLu239lANj*#&UR_bqlYs4d+yxNWznt_dg~r&3h{WDt>5tGx5P~M`g^L{ za+7ACj)b|ax*c49mGf?F_%r$R?wx`5WHI*g&hZ~%s~QB6p5?w)?6 zoP4hIqJhBcj@&${J#)vcmEIHcwIcLWrWT6})!XbG^&-9tL>!+s7o_~!VihsVF7-BZ zXmGZ-sQK=$w?pDf-1H6Ko;NG^XS>3@_3|=h%lcpT3JQB|x03LCb?ZNii@GjR_XKPM zG~AXOLJGI2));Ovs8L{1U3?raMC1%4p2}_S;C&sFYdgQ3DWelS8lzuP7CegQXnE|A zmv5lxdDB-jzi*oHxw?^{9(Cz*_`+pbo7(wzS2RZ7pO#(4#c_y993mbT4=i3-e6aXo z5n!R304zaRLa<1%gkg!m5``rOYaJ}{2OJ`jCN9a#Cj=)j4%YllfkX`+>nd5`}cJyx!(`n)XoYVp&@EK5uzZQ zhR6{D#VnU#?M^ z0PS={pU@eLsz5{z?v89k*C=4W96}>VKHiNAr%=IHpDVP;AqqnKF6_bb+CxB$93llo zFo!3CmFV8I*$6mU--Q6LrUb;5wRo9ns#&Z5My6(q=j zp@4{k%?w1AG^D*3!%D{1uuulX0`30?D`y~bqzR{e7*@)D!cCh-v3q;}#xzOUL>G+k zXkR0O6d;k{4nh?XIdB7hA??`hiXmcp4cw4-C}LWLAsNvX1fZaZkV$)IxY*Xe*04Q_ z5Zm?z#S94g749$ulqkX@OW_B0%7_vWP=e_RM?JChgH=zt>1J@1hwjNmV&E5oV73?P z%~OJ2vvjVognBQB`(R$Zsz$DNlQQ()x`iSpq%0#pOcnQk&Q!Ca01V8GggC3NzTjDZm`ORF$ zMV%lD7%GS`4@(zlsUVw3qcvsl*T9sW(w-0RM1(8+RKAHJFjo&*j@XA-@WFQPT!4pXwBbrk1F|RMmMdbzB3H zkmybt!2(ZBAHxE3@3wOTO*g<38uS(bF{%gy$h!#;!KwyKJhj3#tdBU3CgyH{i63Nv zJrnl1K}wJWK58PuK!k}1kjzg+V41RYZ@8J8nXpMiWfZm`9DRo(4oB z`?v_aZ5pZmS1g9Sy4lT5xd##6lPnUzCkU#61(Y$)io=-8QE$17o+e~+aKb1<1^$}w zS+|;!02z>?34e0A1YuCWN>WBofJ`cvPQ=_cseN2GT?@Lc;n_ep1^hu0UdKHuwiY5l z==zd`=A6=khoM9T_p}ggq1KhtSVH9hh|z-2A0BOZ7hAUiIc-Fn^v8`9OtfVVa^r)b z$~$Kw4pMfAO9O2Kaei=J8$NYkwVX$j>$G8qfmWET0Ax184kP!ZViBp{L)?hpH^PX! zyTn1;?=T`7WpI7z7!y#w##BIthv^8~HXfEmVY3IoX(b5I$5;^LJ?G@%#+LbP;vJ+gVfu+jZf2 zY!(7XbrDsP;=>%w(6Bnf?YBl3ZYPEyK!=3Lf;nBdU4v#W>RYD=efBcoUwVi(Xa9M0 zZ2%uv^6nqQ@qZcEa2yKY{yBF983-;Yt2z^!on^r@7Dqg%R>y56hjfL%qM~(BPwqy(E`kTVJ5o8 z=^+Y&&Zx*EO)ye1pMZ`c&d4Yxm{y}UQcaCbDV=-2oe`RL=j`MDf9HSBx%cjD$Dhex z{*>&LmLj#1iRdG#a&%$;&aQS1e%63iOWYOqveFgBdAa#nYvRjRlvIaHSM%bwNZw{+ zxnfJXLX087kYZS2SYvP)HW;=Tb{H}Y9z%{{k3sX47!xp5?d1xxLp5J4@eut_3)qIO zNKZS%hnBsHM0thpge)(}&yiVH#3E;r{OQr-UXnqv&Gfjf`S@;#xj!Tp4T@okmIR2W zL9Uj>)6U_Lmbm(?MyHbH#kqy0C81+o)O&6nF2?M_rUvIaD|noriT zCvjYh`&ydyy&ki6dYVHFF6J}-b`a%_!<7BNv@~xzq(5p}I7rv$-(N>_y6AddD9r(- z57F_rroG21^%ZsrmC}5$(jSp<-Iq8(B}FRNyw8x7egQFaNeZ~;gWK?YGQ-T;cx!WT zl08ToFL9N*c2+Q-mWQD8C64BG=?cZzi&69%g{Sc=pMAi% z)`IVZmLmL!THFEGs8gvQapO1L*vN>?J`2%`grsV|xqhi0M*MKwRYRK@p^P{ucE6$%LwXP~O5gw4A|F77?_OHV zESBx>7A%H>(4wl?+G0^=Z3CALL=M5h#FlRk+skOb{XGIbFPs}c)$Bkh3MNKAV|E=Q z3+DC;{&gX zV@C+?M0+B%g%TY+P3Aaw6oQ9(@skEtvt#x(p{9E%)_lEQ;1=N*J}$aZK)kOD$fp!B z-=s(!ziQG!rslL*RJj4wpb^1frUCbB<%Giw+1K1B7(C9l9lrzjmq49?Oy;xC3S?%+ z4T1az&7@Bz*+IR5xIls4&IV$_hzFN@wh1jEBMc8`isq&41Q){a_cF8iD3$L~S>tVy zL&J$b_tvInmKcu8gAZRSN;nmc*XE1l7AoJRvZ!OMoN&gDg8_fs)zk=LE4$v`hTxz$ z{TU30<7rggwo@p_{_-~TkIn9kz#FwYrJb4&Mxc3RA}`E@T`8d}nYUb-R3jeQc4Y?z z7aI|5_{#z|8FB8|&EHU^k1CC$7DX3HJa`9FCu=CR`nIrjnUT14b9uQ?rY4f;IsfKU zG`lMjv;8K@AwexygDMKI!JGZ3S@ze1cZBSjarWbnD8UF>Q6!X~r8v*XIRSSCvNa0N z`)?Cmi6UWq!&euWdS{WxDoCG`7AwTLp(#tF%xPjc48M(@m9DR3uLZ;KyiU z;9^JFnp+IgIS*7&{#fM*xiL7XVQ&vBT>JKr(0*+UR*sdz$r$3x-#p*T)N`YPS`&++ z0}pPoINRc?D@?4)8WvLXP?gS85y*EYYG{ll4n7l|t} 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_as.dart b/lib/l10n/generated/app_localizations_as.dart index 8c0be63c..e0c904dd 100644 --- a/lib/l10n/generated/app_localizations_as.dart +++ b/lib/l10n/generated/app_localizations_as.dart @@ -1534,6 +1534,9 @@ class AppLocalizationsAs extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_de.dart b/lib/l10n/generated/app_localizations_de.dart index e2d393e3..2c8dfc56 100644 --- a/lib/l10n/generated/app_localizations_de.dart +++ b/lib/l10n/generated/app_localizations_de.dart @@ -1545,6 +1545,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_en.dart b/lib/l10n/generated/app_localizations_en.dart index 00613692..2ef018d2 100644 --- a/lib/l10n/generated/app_localizations_en.dart +++ b/lib/l10n/generated/app_localizations_en.dart @@ -1533,6 +1533,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_es.dart b/lib/l10n/generated/app_localizations_es.dart index db104223..156754f0 100644 --- a/lib/l10n/generated/app_localizations_es.dart +++ b/lib/l10n/generated/app_localizations_es.dart @@ -1550,6 +1550,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_fr.dart b/lib/l10n/generated/app_localizations_fr.dart index 13cf52b3..88366e2e 100644 --- a/lib/l10n/generated/app_localizations_fr.dart +++ b/lib/l10n/generated/app_localizations_fr.dart @@ -1551,6 +1551,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_hi.dart b/lib/l10n/generated/app_localizations_hi.dart index ba999035..2e2581c2 100644 --- a/lib/l10n/generated/app_localizations_hi.dart +++ b/lib/l10n/generated/app_localizations_hi.dart @@ -1535,6 +1535,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_id.dart b/lib/l10n/generated/app_localizations_id.dart index 11e86435..18338650 100644 --- a/lib/l10n/generated/app_localizations_id.dart +++ b/lib/l10n/generated/app_localizations_id.dart @@ -1539,6 +1539,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_it.dart b/lib/l10n/generated/app_localizations_it.dart index e2dba428..b239a60f 100644 --- a/lib/l10n/generated/app_localizations_it.dart +++ b/lib/l10n/generated/app_localizations_it.dart @@ -1548,6 +1548,9 @@ class AppLocalizationsIt extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_pt.dart b/lib/l10n/generated/app_localizations_pt.dart index 6460d875..87a26002 100644 --- a/lib/l10n/generated/app_localizations_pt.dart +++ b/lib/l10n/generated/app_localizations_pt.dart @@ -1547,6 +1547,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_ru.dart b/lib/l10n/generated/app_localizations_ru.dart index 857ecc82..6799f0cc 100644 --- a/lib/l10n/generated/app_localizations_ru.dart +++ b/lib/l10n/generated/app_localizations_ru.dart @@ -1549,6 +1549,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_th.dart b/lib/l10n/generated/app_localizations_th.dart index e5d1a799..a6955602 100644 --- a/lib/l10n/generated/app_localizations_th.dart +++ b/lib/l10n/generated/app_localizations_th.dart @@ -1533,6 +1533,9 @@ class AppLocalizationsTh extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_tr.dart b/lib/l10n/generated/app_localizations_tr.dart index 5a0f1f4d..73e41501 100644 --- a/lib/l10n/generated/app_localizations_tr.dart +++ b/lib/l10n/generated/app_localizations_tr.dart @@ -1539,6 +1539,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/l10n/generated/app_localizations_zh.dart b/lib/l10n/generated/app_localizations_zh.dart index 5a768a6c..ea3f7d41 100644 --- a/lib/l10n/generated/app_localizations_zh.dart +++ b/lib/l10n/generated/app_localizations_zh.dart @@ -1504,6 +1504,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get custom_buttons_add => 'Add custom button'; + @override + String get custom_buttons_added => 'Custom button added!'; + @override String get custom_buttons_delete => 'Delete custom button'; diff --git a/lib/main.dart b/lib/main.dart index 0b109329..30ceb808 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,6 +14,7 @@ import 'package:hive_flutter/adapters.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/eval/model/m_bridge.dart'; +import 'package:mangayomi/models/custom_button.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; @@ -145,7 +146,7 @@ class _MyAppState extends ConsumerState { Future _initDeepLinks() async { _appLinks = AppLinks(); - _linkSubscription = _appLinks.uriLinkStream.listen((uri) { + _linkSubscription = _appLinks.uriLinkStream.listen((uri) async { if (uri == lastUri) return; // Debouncing Deep Links lastUri = uri; switch (uri.host) { @@ -224,6 +225,62 @@ class _MyAppState extends ConsumerState { }, ); break; + case "add-button": + final buttonDataRaw = uri.queryParametersAll["button"]; + final context = navigatorKey.currentContext; + if (context == null || !context.mounted || buttonDataRaw == null) { + return; + } + final l10n = context.l10n; + for (final buttonRaw in buttonDataRaw) { + final buttonData = jsonDecode( + utf8.decode(base64.decode(buttonRaw)), + ); + if (buttonData is Map) { + final customButton = CustomButton.fromJson(buttonData); + await showDialog( + context: navigatorKey.currentContext!, + builder: (BuildContext context) { + return AlertDialog( + title: Text(l10n.custom_buttons_add), + content: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "${l10n.name}: ${customButton.title ?? 'Unknown'}", + ), + ], + ), + actions: [ + TextButton( + child: Text(l10n.cancel), + onPressed: () => Navigator.of(context).pop(), + ), + FilledButton( + child: Text(l10n.add), + onPressed: () async { + if (context.mounted) Navigator.of(context).pop(); + await isar.writeTxn(() async { + await isar.customButtons.put( + customButton + ..pos = await isar.customButtons.count() + ..isFavourite = false + ..id = null + ..updatedAt = + DateTime.now().millisecondsSinceEpoch, + ); + }); + botToast(l10n.custom_buttons_added); + }, + ), + ], + ); + }, + ); + } + } + break; default: } }); diff --git a/pubspec.lock b/pubspec.lock index 384e6e78..43b33ffc 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1164,7 +1164,7 @@ packages: description: path: media_kit ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.0" @@ -1173,7 +1173,7 @@ packages: description: path: "libs/android/media_kit_libs_android_video" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.7" @@ -1182,7 +1182,7 @@ packages: description: path: "libs/ios/media_kit_libs_ios_video" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1191,7 +1191,7 @@ packages: description: path: "libs/linux/media_kit_libs_linux" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.2.1" @@ -1200,7 +1200,7 @@ packages: description: path: "libs/macos/media_kit_libs_macos_video" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.1.4" @@ -1209,7 +1209,7 @@ packages: description: path: "libs/universal/media_kit_libs_video" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.6" @@ -1218,7 +1218,7 @@ packages: description: path: "libs/windows/media_kit_libs_windows_video" ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.0.11" @@ -1227,7 +1227,7 @@ packages: description: path: media_kit_video ref: HEAD - resolved-ref: "3008dfd943502bcb83e50a56a7e86bb887170cd6" + resolved-ref: "08e91da7229c818a25822b3cd3d77415d5f2af36" url: "https://github.com/Schnitzel5/media-kit.git" source: git version: "1.3.0"