Remove wallpaperPhoto view and related logic (saved in feature/wallpaper-sharing
branch if needed in the future)
This commit is contained in:
parent
1b07243f25
commit
48e9b5fc25
@ -1,59 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
import 'dart:io';
|
|
||||||
import 'dart:ui' as ui;
|
|
||||||
|
|
||||||
import 'package:flutter/rendering.dart';
|
|
||||||
import 'package:image_gallery_saver/image_gallery_saver.dart';
|
|
||||||
import 'package:path_provider/path_provider.dart';
|
|
||||||
import 'package:share_plus/share_plus.dart';
|
|
||||||
import 'package:wonders/common_libs.dart';
|
|
||||||
import 'package:wonders/logic/common/platform_info.dart';
|
|
||||||
import 'package:wonders/ui/common/modals/app_modals.dart';
|
|
||||||
|
|
||||||
class WallPaperLogic {
|
|
||||||
/// Walks user through flow to save a Wonder Poster to their gallery
|
|
||||||
Future<void> save(State state, RenderRepaintBoundary boundary, {required String name}) async {
|
|
||||||
// Time to create an image!
|
|
||||||
Uint8List? pngBytes = await _getPngFromBoundary(boundary);
|
|
||||||
final context = state.context, mounted = state.mounted;
|
|
||||||
if (pngBytes != null && mounted) {
|
|
||||||
bool? result = await showModal(context,
|
|
||||||
child: OkCancelModal(
|
|
||||||
msg: $strings.wallpaperModalSave,
|
|
||||||
));
|
|
||||||
if (result == true && mounted) {
|
|
||||||
showModal(context, child: LoadingModal(msg: $strings.wallpaperModalSaving));
|
|
||||||
if (PlatformInfo.isMobile) {
|
|
||||||
await ImageGallerySaver.saveImage(pngBytes, quality: 95, name: name);
|
|
||||||
} else {
|
|
||||||
await Future.delayed(500.ms);
|
|
||||||
}
|
|
||||||
if (state.mounted) {
|
|
||||||
Navigator.pop(context);
|
|
||||||
showModal(context, child: OkModal(msg: $strings.wallpaperModalSaveComplete));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> share(BuildContext context, RenderRepaintBoundary boundary,
|
|
||||||
{required String name, String wonderName = 'Wonderous'}) async {
|
|
||||||
Uint8List? pngBytes = await _getPngFromBoundary(boundary);
|
|
||||||
if (pngBytes != null) {
|
|
||||||
final directory = (await getApplicationDocumentsDirectory()).path;
|
|
||||||
File imgFile = File('$directory/$name.png');
|
|
||||||
await imgFile.writeAsBytes(pngBytes);
|
|
||||||
Share.shareXFiles([XFile(imgFile.path)],
|
|
||||||
subject: '$wonderName Wallpaper', text: 'Check out this $wonderName wallpaper from the Wonderous app!');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Uint8List?> _getPngFromBoundary(RenderRepaintBoundary boundary) async {
|
|
||||||
ui.Image uiImage = await boundary.toImage();
|
|
||||||
ByteData? byteData = await uiImage.toByteData(format: ui.ImageByteFormat.png);
|
|
||||||
if (byteData != null) {
|
|
||||||
return byteData.buffer.asUint8List();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
@ -8,7 +8,6 @@ import 'package:wonders/logic/artifact_api_logic.dart';
|
|||||||
import 'package:wonders/logic/artifact_api_service.dart';
|
import 'package:wonders/logic/artifact_api_service.dart';
|
||||||
import 'package:wonders/logic/timeline_logic.dart';
|
import 'package:wonders/logic/timeline_logic.dart';
|
||||||
import 'package:wonders/logic/unsplash_logic.dart';
|
import 'package:wonders/logic/unsplash_logic.dart';
|
||||||
import 'package:wonders/logic/wallpaper_logic.dart';
|
|
||||||
import 'package:wonders/logic/wonders_logic.dart';
|
import 'package:wonders/logic/wonders_logic.dart';
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
@ -79,7 +78,6 @@ SettingsLogic get settingsLogic => GetIt.I.get<SettingsLogic>();
|
|||||||
UnsplashLogic get unsplashLogic => GetIt.I.get<UnsplashLogic>();
|
UnsplashLogic get unsplashLogic => GetIt.I.get<UnsplashLogic>();
|
||||||
ArtifactAPILogic get metAPILogic => GetIt.I.get<ArtifactAPILogic>();
|
ArtifactAPILogic get metAPILogic => GetIt.I.get<ArtifactAPILogic>();
|
||||||
CollectiblesLogic get collectiblesLogic => GetIt.I.get<CollectiblesLogic>();
|
CollectiblesLogic get collectiblesLogic => GetIt.I.get<CollectiblesLogic>();
|
||||||
WallPaperLogic get wallpaperLogic => GetIt.I.get<WallPaperLogic>();
|
|
||||||
LocaleLogic get localeLogic => GetIt.I.get<LocaleLogic>();
|
LocaleLogic get localeLogic => GetIt.I.get<LocaleLogic>();
|
||||||
|
|
||||||
/// Global helpers for readability
|
/// Global helpers for readability
|
||||||
|
@ -9,7 +9,6 @@ import 'package:wonders/ui/screens/collection/collection_screen.dart';
|
|||||||
import 'package:wonders/ui/screens/home/wonders_home_screen.dart';
|
import 'package:wonders/ui/screens/home/wonders_home_screen.dart';
|
||||||
import 'package:wonders/ui/screens/intro/intro_screen.dart';
|
import 'package:wonders/ui/screens/intro/intro_screen.dart';
|
||||||
import 'package:wonders/ui/screens/timeline/timeline_screen.dart';
|
import 'package:wonders/ui/screens/timeline/timeline_screen.dart';
|
||||||
import 'package:wonders/ui/screens/wallpaper_photo/wallpaper_photo_screen.dart';
|
|
||||||
import 'package:wonders/ui/screens/wonder_details/wonders_details_screen.dart';
|
import 'package:wonders/ui/screens/wonder_details/wonders_details_screen.dart';
|
||||||
|
|
||||||
/// Shared paths / urls used across the app
|
/// Shared paths / urls used across the app
|
||||||
@ -69,9 +68,6 @@ final appRouter = GoRouter(
|
|||||||
AppRoute('/maps/:type', (s) {
|
AppRoute('/maps/:type', (s) {
|
||||||
return FullscreenMapsViewer(type: _parseWonderType(s.params['type']));
|
return FullscreenMapsViewer(type: _parseWonderType(s.params['type']));
|
||||||
}),
|
}),
|
||||||
AppRoute('/wallpaperPhoto/:type', (s) {
|
|
||||||
return WallpaperPhotoScreen(type: _parseWonderType(s.params['type']));
|
|
||||||
}),
|
|
||||||
]),
|
]),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
@ -1,176 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
|
|
||||||
import 'package:flutter/rendering.dart';
|
|
||||||
import 'package:wonders/common_libs.dart';
|
|
||||||
import 'package:wonders/logic/common/platform_info.dart';
|
|
||||||
import 'package:wonders/logic/data/wonder_data.dart';
|
|
||||||
import 'package:wonders/ui/common/app_icons.dart';
|
|
||||||
import 'package:wonders/ui/common/controls/checkbox.dart';
|
|
||||||
import 'package:wonders/ui/wonder_illustrations/common/animated_clouds.dart';
|
|
||||||
import 'package:wonders/ui/wonder_illustrations/common/wonder_illustration.dart';
|
|
||||||
import 'package:wonders/ui/wonder_illustrations/common/wonder_illustration_config.dart';
|
|
||||||
import 'package:wonders/ui/wonder_illustrations/common/wonder_title_text.dart';
|
|
||||||
|
|
||||||
class WallpaperPhotoScreen extends StatefulWidget {
|
|
||||||
const WallpaperPhotoScreen({Key? key, required this.type}) : super(key: key);
|
|
||||||
final WonderType type;
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<WallpaperPhotoScreen> createState() => _WallpaperPhotoScreenState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _WallpaperPhotoScreenState extends State<WallpaperPhotoScreen> {
|
|
||||||
final GlobalKey _containerKey = GlobalKey();
|
|
||||||
Widget? _illustration;
|
|
||||||
|
|
||||||
bool _showTitleText = true;
|
|
||||||
Timer? _photoRetryTimer;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
_photoRetryTimer?.cancel();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
void _handleTakePhoto(BuildContext context, String wonderName) async {
|
|
||||||
final boundary = _containerKey.currentContext?.findRenderObject() as RenderRepaintBoundary?;
|
|
||||||
if (boundary != null) {
|
|
||||||
wallpaperLogic.save(this, boundary, name: '${wonderName}_wallpaper');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _handleSharePhoto(BuildContext context, String wonderName) async {
|
|
||||||
final boundary = _containerKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
|
|
||||||
wallpaperLogic.share(context, boundary, name: '${wonderName}_wallpaper', wonderName: wonderName);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _handleTextToggle(bool? isActive) {
|
|
||||||
setState(() => _showTitleText = isActive ?? !_showTitleText);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
WonderData wonderData = wondersLogic.getData(widget.type);
|
|
||||||
WonderIllustrationConfig bgConfig = WonderIllustrationConfig.bg(
|
|
||||||
enableAnims: false,
|
|
||||||
enableHero: false,
|
|
||||||
);
|
|
||||||
WonderIllustrationConfig fgConfig = WonderIllustrationConfig(
|
|
||||||
enableAnims: false,
|
|
||||||
enableHero: false,
|
|
||||||
enableBg: false,
|
|
||||||
);
|
|
||||||
Color fgColor = wonderData.type.bgColor; //.withOpacity(.5);
|
|
||||||
|
|
||||||
_illustration = RepaintBoundary(
|
|
||||||
key: _containerKey,
|
|
||||||
child: ClipRect(
|
|
||||||
child: Stack(
|
|
||||||
children: [
|
|
||||||
// Background - apply additional filter to make moon brighter
|
|
||||||
WonderIllustration(
|
|
||||||
widget.type,
|
|
||||||
config: bgConfig,
|
|
||||||
),
|
|
||||||
|
|
||||||
// Clouds
|
|
||||||
FractionallySizedBox(
|
|
||||||
widthFactor: 1,
|
|
||||||
heightFactor: .5,
|
|
||||||
child: AnimatedClouds(
|
|
||||||
wonderType: wonderData.type,
|
|
||||||
opacity: 1,
|
|
||||||
enableAnimations: false,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
// Wonder illustration
|
|
||||||
WonderIllustration(
|
|
||||||
widget.type,
|
|
||||||
config: fgConfig,
|
|
||||||
),
|
|
||||||
|
|
||||||
// Foreground gradient
|
|
||||||
Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
gradient: LinearGradient(
|
|
||||||
begin: Alignment.topCenter,
|
|
||||||
end: Alignment.bottomCenter,
|
|
||||||
colors: [
|
|
||||||
fgColor.withOpacity(0),
|
|
||||||
fgColor.withOpacity(fgColor.opacity * .75),
|
|
||||||
],
|
|
||||||
stops: const [0, 1],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
// Title text
|
|
||||||
if (_showTitleText)
|
|
||||||
BottomCenter(
|
|
||||||
child: Transform.translate(
|
|
||||||
offset: Offset(0.0, -$styles.insets.xl * 2),
|
|
||||||
child: WonderTitleText(wonderData, enableShadows: true),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
return Stack(children: [
|
|
||||||
Container(
|
|
||||||
decoration: BoxDecoration(backgroundBlendMode: BlendMode.color, color: Colors.blue),
|
|
||||||
child: _illustration ?? Container(),
|
|
||||||
),
|
|
||||||
TopCenter(
|
|
||||||
child: SafeArea(
|
|
||||||
child: Padding(
|
|
||||||
padding: EdgeInsets.all($styles.insets.md),
|
|
||||||
child: Row(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(vertical: 10.0),
|
|
||||||
child: BackBtn.close(
|
|
||||||
bgColor: $styles.colors.offWhite,
|
|
||||||
iconColor: $styles.colors.black,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Expanded(child: Container()),
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0, right: 16.0),
|
|
||||||
child: CircleIconBtn(
|
|
||||||
icon: PlatformInfo.isIOS ? AppIcons.share_ios : AppIcons.share_android,
|
|
||||||
bgColor: $styles.colors.offWhite,
|
|
||||||
color: $styles.colors.black,
|
|
||||||
onPressed: () => _handleSharePhoto(context, wonderData.title),
|
|
||||||
semanticLabel: $strings.wallpaperSemanticSharePhoto,
|
|
||||||
size: 44,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
CircleIconBtn(
|
|
||||||
icon: AppIcons.download,
|
|
||||||
onPressed: () => _handleTakePhoto(context, wonderData.title),
|
|
||||||
semanticLabel: $strings.wallpaperSemanticTakePhoto,
|
|
||||||
size: 64,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
BottomCenter(
|
|
||||||
child: Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
children: [
|
|
||||||
SimpleCheckbox(
|
|
||||||
active: _showTitleText, label: $strings.wallpaperCheckboxShowTitle, onToggled: _handleTextToggle),
|
|
||||||
Gap($styles.insets.xl),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
@ -8,7 +8,6 @@ import Foundation
|
|||||||
import desktop_window
|
import desktop_window
|
||||||
import package_info_plus
|
import package_info_plus
|
||||||
import path_provider_foundation
|
import path_provider_foundation
|
||||||
import share_plus
|
|
||||||
import shared_preferences_foundation
|
import shared_preferences_foundation
|
||||||
import url_launcher_macos
|
import url_launcher_macos
|
||||||
|
|
||||||
@ -16,7 +15,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
|||||||
DesktopWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWindowPlugin"))
|
DesktopWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWindowPlugin"))
|
||||||
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
|
||||||
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
|
|
||||||
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
||||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||||
}
|
}
|
||||||
|
40
pubspec.lock
40
pubspec.lock
@ -73,14 +73,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.1.1"
|
version: "3.1.1"
|
||||||
cross_file:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: cross_file
|
|
||||||
sha256: fd832b5384d0d6da4f6df60b854d33accaaeb63aa9e10e736a87381f08dee2cb
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "0.3.3+5"
|
|
||||||
crypto:
|
crypto:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -480,14 +472,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.9.1"
|
version: "1.9.1"
|
||||||
mime:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: mime
|
|
||||||
sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "1.0.4"
|
|
||||||
nested:
|
nested:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -672,22 +656,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.0"
|
version: "2.1.0"
|
||||||
share_plus:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: share_plus
|
|
||||||
sha256: f86c5acc512b20e074137075824fc29e29b2cf395dcbfcc371e96e3e6290cce1
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "8.0.0"
|
|
||||||
share_plus_platform_interface:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: share_plus_platform_interface
|
|
||||||
sha256: "357412af4178d8e11d14f41723f80f12caea54cf0d5cd29af9dcdab85d58aea7"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.3.0"
|
|
||||||
shared_preferences:
|
shared_preferences:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -893,14 +861,6 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.8"
|
version: "3.0.8"
|
||||||
uuid:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: uuid
|
|
||||||
sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313"
|
|
||||||
url: "https://pub.dev"
|
|
||||||
source: hosted
|
|
||||||
version: "3.0.7"
|
|
||||||
vector_graphics:
|
vector_graphics:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -43,7 +43,6 @@ dependencies:
|
|||||||
pointer_interceptor: ^0.9.3+6
|
pointer_interceptor: ^0.9.3+6
|
||||||
provider: ^6.0.5
|
provider: ^6.0.5
|
||||||
rnd: ^0.2.0
|
rnd: ^0.2.0
|
||||||
share_plus: ^8.0.0
|
|
||||||
shared_preferences: ^2.0.17
|
shared_preferences: ^2.0.17
|
||||||
sized_context: ^1.0.0+1
|
sized_context: ^1.0.0+1
|
||||||
smooth_page_indicator: ^1.0.1
|
smooth_page_indicator: ^1.0.1
|
||||||
|
@ -7,14 +7,11 @@
|
|||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
#include <desktop_window/desktop_window_plugin.h>
|
#include <desktop_window/desktop_window_plugin.h>
|
||||||
#include <share_plus/share_plus_windows_plugin_c_api.h>
|
|
||||||
#include <url_launcher_windows/url_launcher_windows.h>
|
#include <url_launcher_windows/url_launcher_windows.h>
|
||||||
|
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
DesktopWindowPluginRegisterWithRegistrar(
|
DesktopWindowPluginRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("DesktopWindowPlugin"));
|
registry->GetRegistrarForPlugin("DesktopWindowPlugin"));
|
||||||
SharePlusWindowsPluginCApiRegisterWithRegistrar(
|
|
||||||
registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi"));
|
|
||||||
UrlLauncherWindowsRegisterWithRegistrar(
|
UrlLauncherWindowsRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
desktop_window
|
desktop_window
|
||||||
share_plus
|
|
||||||
url_launcher_windows
|
url_launcher_windows
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user