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: