diff --git a/android/gradle.properties b/android/gradle.properties index 7be3f195e..80241dfa7 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,4 +1,5 @@ org.gradle.jvmargs=-Xmx6144M android.useAndroidX=true android.enableJetifier=true -android.ndk.suppressMinSdkVersionError=21 \ No newline at end of file + +android.ndk.suppressMinSdkVersionError=21 diff --git a/lib/new-ui/pages/receive_page.dart b/lib/new-ui/pages/receive_page.dart index 84d1e935a..206167770 100644 --- a/lib/new-ui/pages/receive_page.dart +++ b/lib/new-ui/pages/receive_page.dart @@ -271,6 +271,12 @@ class _NewReceivePageState extends State { largeQrMode: _largeQrMode, showAccountsButton: widget.addressListViewModel.hasAddressList, showLabelButton: widget.addressListViewModel.hasAddressList && !hasLabel, + copyData: widget.addressListViewModel.hasPayjoin + ? null + : ClipboardData( + text: widget.addressListViewModel.displayAmount.isEmpty + ? widget.addressListViewModel.uri.address + : widget.addressListViewModel.uri.toString()), onCopyButtonPressed: () { if (widget.addressListViewModel.hasPayjoin) { showModalBottomSheet( @@ -278,13 +284,6 @@ class _NewReceivePageState extends State { context: context, builder: (context) => PayjoinCopyModal(uri: widget.addressListViewModel.uri)); - } else { - Clipboard.setData( - ClipboardData( - text: widget.addressListViewModel.displayAmount.isEmpty - ? widget.addressListViewModel.uri.address - : widget.addressListViewModel.uri.toString()), - ); } }, onAmountButtonPressed: () { diff --git a/lib/new-ui/widgets/copy_wrapper.dart b/lib/new-ui/widgets/copy_wrapper.dart index 587930664..e2e149fbd 100644 --- a/lib/new-ui/widgets/copy_wrapper.dart +++ b/lib/new-ui/widgets/copy_wrapper.dart @@ -30,6 +30,7 @@ class _CopyWrapperState extends State { void handleCopy() async { if (widget.data == null) return; ClipboardUtil.setSensitiveDataToClipboard(widget.data!, isSensitive: widget.isSensitive); + HapticFeedback.mediumImpact(); if (await shouldShowCopied()) { setState(() => copied = true); Future.delayed(widget.duration, () { diff --git a/lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart b/lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart index 9b0f80f57..e4014cb7b 100644 --- a/lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart +++ b/lib/new-ui/widgets/receive_page/receive_bottom_buttons.dart @@ -4,9 +4,12 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/new-ui/widgets/modern_button.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:cake_wallet/new-ui/widgets/copy_wrapper.dart'; class ReceiveBottomButtons extends StatefulWidget { final bool largeQrMode; + final ClipboardData? copyData; final VoidCallback onCopyButtonPressed; final VoidCallback onAmountButtonPressed; final VoidCallback onLabelButtonPressed; @@ -15,7 +18,6 @@ class ReceiveBottomButtons extends StatefulWidget { final bool showAccountsButton; const ReceiveBottomButtons({ - super.key, required this.largeQrMode, required this.onCopyButtonPressed, required this.onAccountsButtonPressed, @@ -23,6 +25,8 @@ class ReceiveBottomButtons extends StatefulWidget { required this.onLabelButtonPressed, required this.showLabelButton, required this.showAccountsButton, + required this.copyData, + super.key, }); @override @@ -30,17 +34,6 @@ class ReceiveBottomButtons extends StatefulWidget { } class _ReceiveBottomButtonsState extends State { - bool copied = false; - - void handleCopy() async { - widget.onCopyButtonPressed(); - if (await shouldShowCopied()) { - setState(() => copied = true); - Future.delayed(const Duration(milliseconds: 1200), () { - if (mounted) setState(() => copied = false); - }); - } - } @override Widget build(BuildContext context) { @@ -63,19 +56,28 @@ class _ReceiveBottomButtonsState extends State { mainAxisAlignment: MainAxisAlignment.center, spacing: 16, children: [ - AnimatedSwitcher( - duration: Duration(milliseconds: 200), - child: ModernButton.svg( - key: ValueKey(copied), - size: 60, - iconSize: 32, - svgPath: "assets/new-ui/copy.svg", - onPressed: handleCopy, - label: copied ? S.of(context).copied : S.of(context).copy, - iconColor: copied ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.surfaceContainer, - backgroundColor: copied ? Theme.of(context).colorScheme.surfaceContainerHighest : Theme.of(context).colorScheme.primary, - ), - ), + GestureDetector( + onTap: widget.copyData == null ? widget.onCopyButtonPressed : null, + child: IgnorePointer( + ignoring: widget.copyData == null, + child: CopyWrapper( + data: widget.copyData, + builder: (context, copied) => AnimatedSwitcher( + duration: Duration(milliseconds: 200), + child: IgnorePointer( + child: ModernButton.svg( + key: ValueKey(copied), + size: 60, + iconSize: 32, + svgPath: "assets/new-ui/copy.svg", + onPressed: () {}, + label: copied ? S.of(context).copied : S.of(context).copy, + iconColor: copied ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.surfaceContainer, + backgroundColor: copied ? Theme.of(context).colorScheme.surfaceContainerHighest : Theme.of(context).colorScheme.primary, + ), + ), + ), + ),),), ModernButton.svg( size: 60, iconSize: 32, @@ -103,22 +105,4 @@ class _ReceiveBottomButtonsState extends State { ), ); } - - - - // android 13 (sdk 33) added a built-in "text was copied to clipboard" ui element - // older android and iphone still needs an indicator though - Future shouldShowCopied() async { - if (!Platform.isAndroid) return true; - - try { - final deviceInfo = DeviceInfoPlugin(); - final androidInfo = await deviceInfo.androidInfo; - final sdk = androidInfo.version.sdkInt; - - return sdk < 33; - } catch (_) { - return true; - } - } } \ No newline at end of file