diff --git a/android/app/build.gradle b/android/app/build.gradle index 86432df..5597d1d 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 30 + compileSdkVersion 31 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ea40889..f9a50f5 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -2,7 +2,8 @@ package="com.example.wamo"> + android:icon="@mipmap/ic_launcher" + android:requestLegacyExternalStorage="true"> + + + + + + + + + diff --git a/android/gradle.properties b/android/gradle.properties index 94adc3a..4d3226a 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,3 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true -android.enableJetifier=true +android.enableJetifier=true \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 92434f9..45c127b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:wamo/bloc/wallpaper_bloc.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; import 'view/main_page.dart'; -void main() { +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await FlutterDownloader.initialize(debug: true // optional: set false to disable printing logs to console + ); runApp(const MyApp()); } diff --git a/lib/view/detail_page.dart b/lib/view/detail_page.dart index b1914b6..af8ba62 100644 --- a/lib/view/detail_page.dart +++ b/lib/view/detail_page.dart @@ -1,4 +1,12 @@ +import 'dart:io'; +import 'dart:isolate'; +import 'dart:ui'; + +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_downloader/flutter_downloader.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:wallpaper/wallpaper.dart'; class DetailPage extends StatefulWidget { @@ -17,6 +25,34 @@ class _DetailPageState extends State { bool downloading = false; String home = "Home Screen", lock = "Lock Screen", both = "Both Screen", system = "System"; + ReceivePort _port = ReceivePort(); + + @override + void initState() { + super.initState(); + + IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port'); + _port.listen((dynamic data) { + String id = data[0]; + DownloadTaskStatus status = data[1]; + int progress = data[2]; + setState(() {}); + }); + + FlutterDownloader.registerCallback(downloadCallback); + } + + @override + void dispose() { + IsolateNameServer.removePortNameMapping('downloader_send_port'); + super.dispose(); + } + + static void downloadCallback(String id, DownloadTaskStatus status, int progress) { + final SendPort? send = IsolateNameServer.lookupPortByName('downloader_send_port'); + send!.send([id, status, progress]); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -56,47 +92,68 @@ class _DetailPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ GestureDetector( - onTap: () { - progressString = Wallpaper.ImageDownloadProgress(widget.url); - progressString!.listen((data) { - setState(() { - res = data; - downloading = true; - }); - }, onDone: () async { - lock = await Wallpaper.homeScreen(); - setState(() { - downloading = false; - lock = lock; + onTap: () { + progressString = Wallpaper.ImageDownloadProgress(widget.url); + progressString!.listen((data) { + setState(() { + res = data; + downloading = true; + }); + }, onDone: () async { + lock = await Wallpaper.homeScreen(); + setState(() { + downloading = false; + lock = lock; + }); + }, onError: (error) { + setState(() { + downloading = false; + }); }); - }, onError: (error) { - setState(() { - downloading = false; - }); - }); + }, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.wallpaper_outlined, + size: 32, + color: Theme.of(context).textTheme.bodyText1!.color, + ), + Text("Set as Wallpaper", style: Theme.of(context).textTheme.bodyText1), + ], + )), + GestureDetector( + onTap: () async { + var status = await Permission.storage.request(); + if (status.isGranted) { + String fileName = widget.url.replaceAll("https://images.wallpaperscraft.com/image/single/", ""); + final taskId = await FlutterDownloader.enqueue( + fileName: fileName, + url: widget.url, + savedDir: '/storage/emulated/0/Download/', + showNotification: true, // show download progress in status bar (for Android) + openFileFromNotification: true, // click on notification to open downloaded file (for Android) + ); + } else { + showDialog( + context: context, + builder: (_) => const Dialog( + child: Text("Please grant the permission"), + ), + ); + } }, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( - Icons.wallpaper_outlined, + Icons.download_outlined, size: 32, color: Theme.of(context).textTheme.bodyText1!.color, ), - Text("Set as Wallpaper", style: Theme.of(context).textTheme.bodyText1), + Text("Download", style: Theme.of(context).textTheme.bodyText1), ], ), - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.download_outlined, - size: 32, - color: Theme.of(context).textTheme.bodyText1!.color, - ), - Text("Download", style: Theme.of(context).textTheme.bodyText1), - ], ) ], ), diff --git a/pubspec.lock b/pubspec.lock index b0572d1..27c597e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -97,6 +97,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "8.0.0" + flutter_downloader: + dependency: "direct main" + description: + name: flutter_downloader + url: "https://pub.dartlang.org" + source: hosted + version: "1.7.1" flutter_lints: dependency: "direct dev" description: @@ -207,6 +214,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + url: "https://pub.dartlang.org" + source: hosted + version: "8.3.0" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "3.7.0" platform: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index c6289f7..4d70ec7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,6 +39,8 @@ dependencies: flutter_bloc: 8.0.0 wallpaper: ^1.0.7 path_provider: ^2.0.7 + flutter_downloader: ^1.7.1 + permission_handler: ^8.3.0 dev_dependencies: flutter_test: