├── Documentation
├── Ads Configuration
│ ├── Ads Configuration Image.PNG
│ └── Ads Configuration2 Image.PNG
├── Artboard – 2.png
├── Artboard – 3.png
├── Artboard – 4.png
├── Change App Name
│ └── Change App Name Image.PNG
├── New Package Name
│ ├── New Package Name Image.PNG
│ └── New Package Name.txt
├── inline.png
├── screenshot_1.png
├── screenshot_10.png
├── screenshot_11.png
├── screenshot_2.png
├── screenshot_3.png
├── screenshot_4.png
├── screenshot_5.png
├── screenshot_6.png
├── screenshot_7.png
├── screenshot_8.png
├── screenshot_9.png
└── thubmail.png
├── DownloadIT
├── .gitignore
├── .metadata
├── LICENSE
├── README.md
├── android
│ ├── app
│ │ ├── build.gradle
│ │ ├── proguard-rules.pro
│ │ └── src
│ │ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── downloading
│ │ │ │ │ └── reddit_video_downloader
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── res
│ │ │ │ ├── drawable
│ │ │ │ ├── ic_launcher_background.xml
│ │ │ │ └── launch_background.xml
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ └── values
│ │ │ │ └── styles.xml
│ │ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle.properties
│ ├── gradle
│ │ └── wrapper
│ │ │ └── gradle-wrapper.properties
│ └── settings.gradle
├── animation
│ ├── download.json
│ ├── facebook.json
│ ├── instagram.json
│ ├── tik-tok.json
│ └── whatsapp.json
├── assets
│ ├── fonts
│ │ ├── Billabong.ttf
│ │ ├── WorkSans-Bold.ttf
│ │ ├── WorkSans-Medium.ttf
│ │ ├── WorkSans-Regular.ttf
│ │ └── WorkSans-SemiBold.ttf
│ ├── icon
│ │ ├── download.png
│ │ ├── facebook.png
│ │ ├── icon.png
│ │ ├── instagram.png
│ │ ├── reddit.png
│ │ ├── tiktok.png
│ │ └── whatsapp.png
│ └── images
│ │ ├── feedbackImage.png
│ │ ├── helpImage.png
│ │ ├── icon.png
│ │ ├── inviteImage.png
│ │ ├── placeholder_image.png
│ │ ├── placeholder_video.gif
│ │ └── rvd.png
├── ios
│ ├── Flutter
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Runner.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ └── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── Runner
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ └── Icon-App-83.5x83.5@2x.png
│ │ └── LaunchImage.imageset
│ │ │ ├── Contents.json
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ └── README.md
│ │ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
├── lib
│ ├── WidgetHelper
│ │ ├── ContainerLotties.dart
│ │ └── Playbtn.dart
│ ├── actions
│ │ └── actions.dart
│ ├── constants
│ │ ├── appConstant.dart
│ │ └── appTheme.dart
│ ├── effects
│ │ └── effects.dart
│ ├── helper
│ │ ├── AdsHelper.dart
│ │ ├── ShowAds.dart
│ │ ├── VideoCard.dart
│ │ ├── app_animations.dart
│ │ ├── customDrawer
│ │ │ ├── drawerUserController.dart
│ │ │ └── homeDrawer.dart
│ │ ├── showToast.dart
│ │ └── theme_changer.dart
│ ├── main.dart
│ ├── models
│ │ ├── app_state.dart
│ │ └── download.dart
│ ├── reduers
│ │ ├── app_state_reducer.dart
│ │ └── download_reducer.dart
│ ├── screens
│ │ ├── About.dart
│ │ ├── ImagesDetails.dart
│ │ ├── Thumbnails.dart
│ │ ├── VideoPlayer.dart
│ │ ├── facebookDownload
│ │ │ ├── facebookData.dart
│ │ │ ├── facebookDownloadScreen.dart
│ │ │ └── galleryScreen.dart
│ │ ├── galleryScreen.dart
│ │ ├── galleryScreenReddit.dart
│ │ ├── home
│ │ │ ├── download.dart
│ │ │ └── home.dart
│ │ ├── instagramDownload
│ │ │ ├── InstaData.dart
│ │ │ ├── galleryScreen.dart
│ │ │ └── instagramDownloadScreen.dart
│ │ ├── tiktokDownload
│ │ │ ├── galleryScreen.dart
│ │ │ ├── tiktokData.dart
│ │ │ └── tiktokDownloadScreen.dart
│ │ └── whatsappDownload
│ │ │ ├── galleryScreen.dart
│ │ │ ├── imageScreen.dart
│ │ │ ├── videoScreen.dart
│ │ │ └── whatsappDownloadScreen.dart
│ └── utils.dart
├── pubspec.lock
├── pubspec.yaml
└── test
│ └── widget_test.dart
└── README.md
/Documentation/Ads Configuration/Ads Configuration Image.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/Ads Configuration/Ads Configuration Image.PNG
--------------------------------------------------------------------------------
/Documentation/Ads Configuration/Ads Configuration2 Image.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/Ads Configuration/Ads Configuration2 Image.PNG
--------------------------------------------------------------------------------
/Documentation/Artboard – 2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/Artboard – 2.png
--------------------------------------------------------------------------------
/Documentation/Artboard – 3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/Artboard – 3.png
--------------------------------------------------------------------------------
/Documentation/Artboard – 4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/Artboard – 4.png
--------------------------------------------------------------------------------
/Documentation/Change App Name/Change App Name Image.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/Change App Name/Change App Name Image.PNG
--------------------------------------------------------------------------------
/Documentation/New Package Name/New Package Name Image.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/New Package Name/New Package Name Image.PNG
--------------------------------------------------------------------------------
/Documentation/New Package Name/New Package Name.txt:
--------------------------------------------------------------------------------
1 | ************El Hadjaoui************
2 |
3 | 1- go to your root project
4 | 2- right click
5 | 3- select 'Replace in path' & select 'Replace All' after adding your new package name .
--------------------------------------------------------------------------------
/Documentation/inline.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/inline.png
--------------------------------------------------------------------------------
/Documentation/screenshot_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_1.png
--------------------------------------------------------------------------------
/Documentation/screenshot_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_10.png
--------------------------------------------------------------------------------
/Documentation/screenshot_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_11.png
--------------------------------------------------------------------------------
/Documentation/screenshot_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_2.png
--------------------------------------------------------------------------------
/Documentation/screenshot_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_3.png
--------------------------------------------------------------------------------
/Documentation/screenshot_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_4.png
--------------------------------------------------------------------------------
/Documentation/screenshot_5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_5.png
--------------------------------------------------------------------------------
/Documentation/screenshot_6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_6.png
--------------------------------------------------------------------------------
/Documentation/screenshot_7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_7.png
--------------------------------------------------------------------------------
/Documentation/screenshot_8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_8.png
--------------------------------------------------------------------------------
/Documentation/screenshot_9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/screenshot_9.png
--------------------------------------------------------------------------------
/Documentation/thubmail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/Documentation/thubmail.png
--------------------------------------------------------------------------------
/DownloadIT/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | #.vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | # Android related
34 | **/android/**/gradle-wrapper.jar
35 | **/android/.gradle
36 | **/android/captures/
37 | **/android/gradlew
38 | **/android/gradlew.bat
39 | **/android/local.properties
40 | **/android/key.properties
41 | **/android/**/GeneratedPluginRegistrant.java
42 |
43 | # iOS/XCode related
44 | **/ios/**/*.mode1v3
45 | **/ios/**/*.mode2v3
46 | **/ios/**/*.moved-aside
47 | **/ios/**/*.pbxuser
48 | **/ios/**/*.perspectivev3
49 | **/ios/**/*sync/
50 | **/ios/**/.sconsign.dblite
51 | **/ios/**/.tags*
52 | **/ios/**/.vagrant/
53 | **/ios/**/DerivedData/
54 | **/ios/**/Icon?
55 | **/ios/**/Pods/
56 | **/ios/**/.symlinks/
57 | **/ios/**/profile
58 | **/ios/**/xcuserdata
59 | **/ios/.generated/
60 | **/ios/Flutter/App.framework
61 | **/ios/Flutter/Flutter.framework
62 | **/ios/Flutter/Generated.xcconfig
63 | **/ios/Flutter/app.flx
64 | **/ios/Flutter/app.zip
65 | **/ios/Flutter/flutter_assets/
66 | **/ios/Flutter/flutter_export_environment.sh
67 | **/ios/ServiceDefinitions.json
68 | **/ios/Runner/GeneratedPluginRegistrant.*
69 |
70 | # Exceptions to above rules.
71 | !**/ios/**/default.mode1v3
72 | !**/ios/**/default.mode2v3
73 | !**/ios/**/default.pbxuser
74 | !**/ios/**/default.perspectivev3
75 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
76 |
--------------------------------------------------------------------------------
/DownloadIT/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 68587a0916366e9512a78df22c44163d041dd5f3
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/DownloadIT/README.md:
--------------------------------------------------------------------------------
1 | # reddit_video_downloader
2 |
3 | A new Flutter application.
4 |
5 | ## Getting Started
6 |
7 | This project is a starting point for a Flutter application.
8 |
9 | A few resources to get you started if this is your first Flutter project:
10 |
11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
13 |
14 | For help getting started with Flutter, view our
15 | [online documentation](https://flutter.dev/docs), which offers tutorials,
16 | samples, guidance on mobile development, and a full API reference.
17 |
--------------------------------------------------------------------------------
/DownloadIT/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | def keystoreProperties = new Properties()
29 | def keystorePropertiesFile = rootProject.file('key.properties')
30 | if (keystorePropertiesFile.exists()) {
31 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
32 | }
33 |
34 | android {
35 | compileSdkVersion 29
36 |
37 | lintOptions {
38 | disable 'InvalidPackage'
39 | }
40 |
41 | sourceSets {
42 | main.java.srcDirs += 'src/main/kotlin'
43 | }
44 |
45 | lintOptions {
46 | disable 'InvalidPackage'
47 | }
48 |
49 | defaultConfig {
50 | applicationId "com.downloading.social_media"
51 | minSdkVersion 21
52 | targetSdkVersion 29
53 | versionCode flutterVersionCode.toInteger()
54 | versionName flutterVersionName
55 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
56 | }
57 |
58 | signingConfigs {
59 | release {
60 | keyAlias keystoreProperties['keyAlias']
61 | keyPassword keystoreProperties['keyPassword']
62 | storeFile file(keystoreProperties['storeFile'])
63 | storePassword keystoreProperties['storePassword']
64 | }
65 | }
66 |
67 | buildTypes {
68 | release {
69 | signingConfig signingConfigs.release
70 | minifyEnabled true
71 | useProguard true
72 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
73 | }
74 | }
75 | }
76 |
77 | flutter {
78 | source '../..'
79 | }
80 |
81 | dependencies {
82 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
83 | testImplementation 'junit:junit:4.12'
84 | androidTestImplementation 'androidx.test:runner:1.1.0'
85 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
86 | }
87 |
--------------------------------------------------------------------------------
/DownloadIT/android/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | ## Flutter wrapper
2 | -keep class io.flutter.app.** { *; }
3 | -keep class io.flutter.plugin.** { *; }
4 | -keep class io.flutter.util.** { *; }
5 | -keep class io.flutter.view.** { *; }
6 | -keep class io.flutter.** { *; }
7 | -keep class io.flutter.plugins.** { *; }
8 | -dontwarn io.flutter.embedding.**
9 |
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
16 |
20 |
25 |
28 |
29 |
32 |
39 |
43 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/main/kotlin/com/downloading/reddit_video_downloader/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.downloading.social_media
2 |
3 | import android.content.Intent
4 | import android.os.Bundle
5 |
6 | import io.flutter.app.FlutterActivity
7 | import io.flutter.plugins.GeneratedPluginRegistrant
8 | import io.flutter.plugin.common.MethodChannel
9 |
10 |
11 |
12 |
13 |
14 | class MainActivity: FlutterActivity() {
15 | private var sharedText: String? = null
16 |
17 | override fun onCreate(savedInstanceState: Bundle?) {
18 | super.onCreate(savedInstanceState)
19 | GeneratedPluginRegistrant.registerWith(this)
20 | val intent = getIntent()
21 | val action = intent.action
22 | val type = intent.type
23 |
24 | if (Intent.ACTION_SEND == action && type != null) {
25 | if (type == "text/plain") {
26 | handleSendText(intent);
27 | }
28 | }
29 |
30 | MethodChannel(flutterView, "app.channel.shared.data").setMethodCallHandler { call, result ->
31 | if (call.method.contentEquals("getSharedText")) {
32 | result.success(sharedText)
33 | sharedText = null
34 | }
35 | }
36 | }
37 |
38 | fun handleSendText(intent: Intent) {
39 | sharedText = intent.getStringExtra(Intent.EXTRA_TEXT)
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
10 |
12 |
14 |
16 |
18 |
20 |
22 |
24 |
26 |
28 |
30 |
32 |
34 |
36 |
38 |
40 |
42 |
44 |
46 |
48 |
50 |
52 |
54 |
56 |
58 |
60 |
62 |
64 |
66 |
68 |
70 |
72 |
74 |
75 |
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/DownloadIT/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/DownloadIT/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.3.72'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:3.3.1'
10 | classpath 'com.google.gms:google-services:4.2.0'
11 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | google()
18 | jcenter()
19 | }
20 | }
21 |
22 | rootProject.buildDir = '../build'
23 | subprojects {
24 | project.buildDir = "${rootProject.buildDir}/${project.name}"
25 | }
26 | subprojects {
27 | project.evaluationDependsOn(':app')
28 | }
29 |
30 | task clean(type: Delete) {
31 | delete rootProject.buildDir
32 | }
33 |
34 | ext {
35 | flutterFFmpegPackage = 'full-lts'
36 | }
37 |
--------------------------------------------------------------------------------
/DownloadIT/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
--------------------------------------------------------------------------------
/DownloadIT/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
7 |
--------------------------------------------------------------------------------
/DownloadIT/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/DownloadIT/animation/facebook.json:
--------------------------------------------------------------------------------
1 | {"v":"5.1.16","fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":512,"h":512,"nm":"Comp 3","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 3/Untitled-1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[340,84,0],"ix":2},"a":{"a":0,"k":[304.286,66.19,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[312.009,354.941],[103.755,355.942]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":49,"s":[0],"e":[38]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":60,"s":[38],"e":[100]},{"t":79.000003217736}],"ix":1},"e":{"a":0,"k":0,"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":49,"s":[173],"e":[115]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":60,"s":[115],"e":[0]},{"t":79.000003217736}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":70,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[92.688,-104.32],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100.596,100.234],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[47.25,-0.5],[0,0],[0,0]],"o":[[0,0],[-56.167,1.351],[0,0],[0,0]],"v":[[318.036,198.19],[262.536,198.69],[205.642,260.662],[206.642,582.91]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":31,"s":[0],"e":[100]},{"t":79.000003217736}],"ix":1},"e":{"a":0,"k":0,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":70,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[92.688,-104.32],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100.596,100.234],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":93.0000037879676,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"bg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,268,0],"ix":2},"a":{"a":0,"k":[236,248,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"t":33.0000013441176}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-54.341],[0,0],[-54.342,0],[0,0],[0,54.353],[0,0],[54.334,0]],"o":[[-54.342,0],[0,0],[0,54.353],[0,0],[54.334,0],[0,0],[0,-54.341],[0,0]],"v":[[-141.105,-239.492],[-239.501,-141.11],[-239.501,141.102],[-141.105,239.492],[141.121,239.492],[239.501,141.102],[239.501,-141.11],[141.121,-239.492]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.239215686917,0.352941185236,0.588235318661,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[239.751,239.742],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":93.0000037879676,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/DownloadIT/animation/instagram.json:
--------------------------------------------------------------------------------
1 | {"v":"5.1.16","fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":512,"h":512,"nm":"Comp 4","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 4/Untitled-1 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[348,160,0],"ix":2},"a":{"a":0,"k":[333,141.5,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":69,"s":[0,0,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":83,"s":[100,100,100],"e":[110,110,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":85,"s":[110,110,100],"e":[100,100,100]},{"t":87.0000035435826}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-13.217],[13.414,0],[0,13.225],[-13.425,0]],"o":[[0,13.225],[-13.425,0],[0,-13.217],[13.414,0]],"v":[[24.31,0.008],[-0.009,23.949],[-24.31,0.008],[-0.009,-23.949]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[334.738,142.242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"c2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[260,258,0],"ix":2},"a":{"a":0,"k":[244,242,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[193.031,193.031],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":42,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[242,242],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[80.822,80.822],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":50,"s":[0],"e":[100]},{"t":70.0000028511585}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"c1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[355.234,332.156],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":98,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":38,"s":[0],"e":[100]},{"t":70.0000028511585}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":38,"s":[0],"e":[0]},{"t":70.0000028511585}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":39,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[1.414,5.445],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[92.85,95.328],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"bg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"t":45.0000018328876}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-53.772],[0,0],[-54.599,0],[0,0],[0,53.749],[0,0],[54.581,0]],"o":[[-54.599,0],[0,0],[0,53.749],[0,0],[54.581,0],[0,0],[0,-53.772],[0,0]],"v":[[-141.782,-237],[-240.634,-139.617],[-240.634,139.647],[-141.782,237],[141.783,237],[240.634,139.647],[240.634,-139.617],[141.783,-237]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"g":{"p":5,"k":{"a":0,"k":[0,0.953,0.746,0.426,0.345,0.92,0.55,0.399,0.691,0.886,0.353,0.373,0.845,0.782,0.302,0.539,1,0.678,0.251,0.706],"ix":9}},"s":{"a":0,"k":[-140.305,200.922],"ix":5},"e":{"a":0,"k":[152.328,-185.047],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.087,3.203],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/DownloadIT/animation/tik-tok.json:
--------------------------------------------------------------------------------
1 | {"v":"5.7.1","fr":30.0000305175781,"ip":0,"op":91.000092569987,"w":500,"h":500,"nm":"tiktok","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"logo","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[242.693,241.314,0],"to":[-7.986,-9.899,0],"ti":[0,10.162,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13.006,"s":[226.937,209.969,0],"to":[0,-12.54,0],"ti":[-12.538,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.021,"s":[249.679,187.222,0],"to":[12.542,0,0],"ti":[0,-12.54,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39.078,"s":[272.598,209.969,0],"to":[0,15.231,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57.124,"s":[247.789,251.963,0],"to":[-10.459,12.409,0],"ti":[0,-11.801,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":72.978,"s":[226.937,289.26,0],"to":[0,12.542,0],"ti":[-12.54,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":86.033,"s":[249.855,312,0],"to":[12.535,0,0],"ti":[0,12.542,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":99.046,"s":[272.598,289.26,0],"to":[0,-10.162,0],"ti":[7.991,9.891,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":112.055,"s":[256.839,257.911,0],"to":[0,0,0],"ti":[0,0,0]},{"t":120.000122070313,"s":[242.693,241.314,0]}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[44,44,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-194.248,-11.545],[0,-143.018],[70.486,62.867],[0,0],[131.388,-24.918],[55.641,12.155],[-321.847,-50.876],[0,-153.524],[-35.33,-79.198],[-46.177,101.72],[0,25.485],[0,0]],"o":[[0,0],[0.042,12.803],[0,172.2],[-14.594,0.865],[0,0],[1.743,126.073],[-36.812,6.971],[-320.534,-95.882],[0,153.481],[-132.957,-19.561],[32.155,72.1],[5.228,-19.908],[0,0],[0,0]],"v":[[160.651,-420.534],[160.651,-419.827],[358.689,-210.378],[358.777,-67.36],[160.432,-137.546],[160.214,140.874],[-39.611,415.497],[-165.21,411.097],[-57.385,-109.317],[-57.297,44.164],[-199.402,214.408],[11.314,200.425],[19.157,132.335],[19.157,-420.534]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":241.000245157878,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"logo blue","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-6,"s":[242.693,241.314,0],"to":[-7.986,-9.899,0],"ti":[0,10.162,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7.006,"s":[226.937,209.969,0],"to":[0,-12.54,0],"ti":[-12.538,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20.021,"s":[249.679,187.222,0],"to":[12.542,0,0],"ti":[0,-12.54,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33.078,"s":[272.598,209.969,0],"to":[0,15.231,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51.124,"s":[247.789,251.963,0],"to":[-10.459,12.409,0],"ti":[0,-11.801,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66.978,"s":[226.937,289.26,0],"to":[0,12.542,0],"ti":[-12.54,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80.033,"s":[249.855,312,0],"to":[12.535,0,0],"ti":[0,12.542,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":93.046,"s":[272.598,289.26,0],"to":[0,-10.162,0],"ti":[7.991,9.891,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":106.055,"s":[256.839,257.911,0],"to":[0,0,0],"ti":[0,0,0]},{"t":114.000115966797,"s":[242.693,241.314,0]}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[44,44,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-194.248,-11.545],[0,-143.018],[70.486,62.867],[0,0],[131.388,-24.918],[55.641,12.155],[-321.847,-50.876],[0,-153.524],[-35.33,-79.198],[-46.177,101.72],[0,25.485],[0,0]],"o":[[0,0],[0.042,12.803],[0,172.2],[-14.594,0.865],[0,0],[1.743,126.073],[-36.812,6.971],[-320.534,-95.882],[0,153.481],[-132.957,-19.561],[32.155,72.1],[5.228,-19.908],[0,0],[0,0]],"v":[[160.651,-420.534],[160.651,-419.827],[358.689,-210.378],[358.777,-67.36],[160.432,-137.546],[160.214,140.874],[-39.611,415.497],[-165.21,411.097],[-57.385,-109.317],[-57.297,44.164],[-199.402,214.408],[11.314,200.425],[19.157,132.335],[19.157,-420.534]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.968627510819,0.937254961799,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-6.00000610351563,"op":241.000245157878,"st":-6.00000610351563,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"logo red","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-114,"s":[242.693,241.314,0],"to":[-7.986,-9.899,0],"ti":[0,10.162,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-100.994,"s":[226.937,209.969,0],"to":[0,-12.54,0],"ti":[-12.538,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-87.98,"s":[249.679,187.222,0],"to":[12.542,0,0],"ti":[0,-12.54,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-74.922,"s":[272.598,209.969,0],"to":[0,15.231,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-56.876,"s":[247.789,251.963,0],"to":[-10.459,12.409,0],"ti":[0,-11.801,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-41.023,"s":[226.937,289.26,0],"to":[0,12.542,0],"ti":[-12.54,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-27.967,"s":[249.855,312,0],"to":[12.535,0,0],"ti":[0,12.542,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-14.954,"s":[272.598,289.26,0],"to":[0,-10.162,0],"ti":[7.991,9.891,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":-1.945,"s":[256.839,257.911,0],"to":[0,0,0],"ti":[0,0,0]},{"t":6.00000610351563,"s":[242.693,241.314,0]}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[44,44,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-194.248,-11.545],[0,-143.018],[70.486,62.867],[0,0],[131.388,-24.918],[55.641,12.155],[-321.847,-50.876],[0,-153.524],[-35.33,-79.198],[-46.177,101.72],[0,25.485],[0,0]],"o":[[0,0],[0.042,12.803],[0,172.2],[-14.594,0.865],[0,0],[1.743,126.073],[-36.812,6.971],[-320.534,-95.882],[0,153.481],[-132.957,-19.561],[32.155,72.1],[5.228,-19.908],[0,0],[0,0]],"v":[[160.651,-420.534],[160.651,-419.827],[358.689,-210.378],[358.777,-67.36],[160.432,-137.546],[160.214,140.874],[-39.611,415.497],[-165.21,411.097],[-57.385,-109.317],[-57.297,44.164],[-199.402,214.408],[11.314,200.425],[19.157,132.335],[19.157,-420.534]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0.309803921569,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-114.000115966797,"op":241.000245157878,"st":-114.000115966797,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2},"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[88,88,100],"ix":6}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":91.000092569987,"s":[8.033]}],"ix":2},"w":500,"h":500,"ip":0,"op":91.000092569987,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/DownloadIT/animation/whatsapp.json:
--------------------------------------------------------------------------------
1 | {"v":"5.1.16","fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":512,"h":512,"nm":"Comp 2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":24,"s":[0],"e":[100]},{"t":47.0000019143492}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-94.926],[-15.292,-25.682],[0,0],[0,0],[-30.229,0],[0,94.905],[94.917,0]],"o":[[0,32.067],[0,0],[0,0],[24.687,13.698],[94.917,0],[0,-94.926],[-94.912,0]],"v":[[-171.852,-1.626],[-147.759,86.115],[-169.425,173.479],[-83.304,148.682],[0.001,170.227],[171.852,-1.626],[0.001,-173.479]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,30.137],[-78.793,0],[0,-78.801],[78.8,0],[22.974,15.835],[0,0]],"o":[[-15.958,-23.051],[0,-78.801],[78.8,0],[0,78.796],[-30.017,0],[0,0],[0,0]],"v":[[-115.39,80.156],[-140.725,-0.983],[1.944,-143.658],[144.62,-0.983],[1.944,141.692],[-78.885,116.549],[-127.923,130.682]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1.16,3.292],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":93.0000037879676,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"ph","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":42,"s":[0],"e":[100]},{"t":60.0000024438501}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":58,"s":[0],"e":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":61,"s":[-15],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":64,"s":[0],"e":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":68,"s":[-15],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":71,"s":[0],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":74,"s":[0],"e":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":79,"s":[-15],"e":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":82,"s":[0],"e":[-15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":85,"s":[-15],"e":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p833_1_0p333_0"],"t":88,"s":[0],"e":[0]},{"t":93.0000037879676}],"ix":10},"p":{"a":0,"k":[230,266,0],"ix":2},"a":{"a":0,"k":[208,246,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.173,-1.043],[-10.384,-32.43],[-101.175,-18.808],[-9.725,22.059],[0.349,5.172],[4.138,2.39],[6.073,3.002],[6.065,-1.671],[3.009,-3.228],[3.971,-4.137],[13.615,38.236],[-1.982,2.29],[-0.259,5.589],[1.896,4.871],[1.204,3.153],[3.154,3.352],[3.934,0]],"o":[[0,0],[0,0],[0,0],[2.102,-4.758],[-0.347,-5.024],[-5.331,-3.049],[-5.272,-2.587],[-4.447,1.232],[-3.932,4.161],[0,0],[1.996,-2.292],[3.349,-3.888],[0.251,-5.37],[-1.22,-3.131],[-2.171,-5.717],[-2.671,-2.83],[-2.361,0]],"v":[[-56.887,-81.256],[-80.224,-32.62],[41.051,77.62],[87.083,60.756],[90.259,44.134],[82.234,33.394],[66.09,24.485],[48.695,19.728],[38.048,28.251],[26.129,40.662],[-38.722,-16.39],[-32.754,-23.264],[-24.133,-36.484],[-27.693,-52.072],[-31.371,-61.48],[-39.501,-78.55],[-49.967,-82.816]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[233.973,236.679],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":93.0000037879676,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"bg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2},"a":{"a":0,"k":[236,236,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":0,"s":[0,0,100],"e":[100,100,100]},{"t":31.0000012626559}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-53.394],[0,0],[-53.386,0],[0,0],[0,53.384],[0,0],[53.384,0]],"o":[[-53.386,0],[0,0],[0,53.384],[0,0],[53.384,0],[0,0],[0,-53.394],[0,0]],"v":[[-138.613,-235.278],[-235.28,-138.618],[-235.28,138.627],[-138.613,235.277],[138.631,235.277],[235.28,138.627],[235.28,-138.618],[138.631,-235.278]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.360784322023,0.780392169952,0.411764711142,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[235.53,235.528],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":93.0000037879676,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/DownloadIT/assets/fonts/Billabong.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/fonts/Billabong.ttf
--------------------------------------------------------------------------------
/DownloadIT/assets/fonts/WorkSans-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/fonts/WorkSans-Bold.ttf
--------------------------------------------------------------------------------
/DownloadIT/assets/fonts/WorkSans-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/fonts/WorkSans-Medium.ttf
--------------------------------------------------------------------------------
/DownloadIT/assets/fonts/WorkSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/fonts/WorkSans-Regular.ttf
--------------------------------------------------------------------------------
/DownloadIT/assets/fonts/WorkSans-SemiBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/fonts/WorkSans-SemiBold.ttf
--------------------------------------------------------------------------------
/DownloadIT/assets/icon/download.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/icon/download.png
--------------------------------------------------------------------------------
/DownloadIT/assets/icon/facebook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/icon/facebook.png
--------------------------------------------------------------------------------
/DownloadIT/assets/icon/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/icon/icon.png
--------------------------------------------------------------------------------
/DownloadIT/assets/icon/instagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/icon/instagram.png
--------------------------------------------------------------------------------
/DownloadIT/assets/icon/reddit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/icon/reddit.png
--------------------------------------------------------------------------------
/DownloadIT/assets/icon/tiktok.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/icon/tiktok.png
--------------------------------------------------------------------------------
/DownloadIT/assets/icon/whatsapp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/icon/whatsapp.png
--------------------------------------------------------------------------------
/DownloadIT/assets/images/feedbackImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/images/feedbackImage.png
--------------------------------------------------------------------------------
/DownloadIT/assets/images/helpImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/images/helpImage.png
--------------------------------------------------------------------------------
/DownloadIT/assets/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/images/icon.png
--------------------------------------------------------------------------------
/DownloadIT/assets/images/inviteImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/images/inviteImage.png
--------------------------------------------------------------------------------
/DownloadIT/assets/images/placeholder_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/images/placeholder_image.png
--------------------------------------------------------------------------------
/DownloadIT/assets/images/placeholder_video.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/images/placeholder_video.gif
--------------------------------------------------------------------------------
/DownloadIT/assets/images/rvd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/assets/images/rvd.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/elhadjaoui/Flutter-Download-App/c9ad39824d2faa7e0e1716117d6113831f420576/DownloadIT/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | reddit_video_downloader
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/DownloadIT/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
--------------------------------------------------------------------------------
/DownloadIT/lib/WidgetHelper/ContainerLotties.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:google_fonts/google_fonts.dart';
3 | import 'package:lottie/lottie.dart';
4 |
5 | class ContainerLotties extends StatefulWidget {
6 | final String header;
7 | final String animationPath;
8 |
9 | const ContainerLotties({
10 | Key key,
11 | @required this.header,
12 | @required this.animationPath,
13 | }) : super(key: key);
14 |
15 | @override
16 | _ContainerLottiesState createState() => _ContainerLottiesState();
17 | }
18 |
19 | class _ContainerLottiesState extends State {
20 | var connectivity;
21 | @override
22 | void initState() {
23 | // TODO: implement initState
24 | super.initState();
25 |
26 | }
27 |
28 | @override
29 | Widget build(BuildContext context) {
30 | return Padding(
31 | padding: const EdgeInsets.all(8.0),
32 | child: Container(
33 | height: MediaQuery.of(context).size.height * .20,
34 | width: MediaQuery.of(context).size.width * .38,
35 | decoration: _semptomBoxDecoration(),
36 | child: Padding(
37 | padding: const EdgeInsets.all(11),
38 | child: Center(
39 | child: Table(
40 |
41 | children: [
42 | TableRow(children: [
43 | TableCell(
44 | child: AspectRatio(
45 | aspectRatio: 2,
46 | child: Center(
47 | child: Image.asset(widget.animationPath, fit: BoxFit.fitHeight,)
48 |
49 | ),
50 | ),
51 | )
52 | ]),
53 | TableRow(children: [TableCell(child: Text(widget.header, style: _secondaryStyle, textAlign: TextAlign.center))]),
54 |
55 | ],
56 | ),
57 | ),
58 | ),
59 | ),
60 | );
61 | }
62 | TextStyle get _secondaryStyle => GoogleFonts.openSans(
63 | color: Color(0xFF5C93C4),
64 | fontWeight: FontWeight.w700,
65 | letterSpacing: 0.20,
66 | fontSize: 12);
67 | BoxDecoration _semptomBoxDecoration() {
68 | return BoxDecoration(
69 | color: Theme.of(context).cardColor,
70 | borderRadius: BorderRadius.all(Radius.circular(20)),
71 | boxShadow: [BoxShadow(color: Colors.black38, spreadRadius: 0, blurRadius: 10)],
72 | );
73 | }
74 |
75 | }
--------------------------------------------------------------------------------
/DownloadIT/lib/WidgetHelper/Playbtn.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:reddit_video_downloader/helper/AdsHelper.dart';
4 | import 'package:reddit_video_downloader/helper/ShowAds.dart';
5 | import 'package:reddit_video_downloader/screens/VideoPlayer.dart';
6 |
7 | class Play extends StatelessWidget {
8 | final file;
9 | Play({this.file});
10 | ShowAds _showAds = ShowAds(adUnitID: AdsHelper.nativeAds);
11 |
12 | @override
13 | Widget build(BuildContext context) {
14 | return Material(
15 | color: Colors.black87,
16 | type: MaterialType.circle,
17 | child: InkWell(
18 | onTap: () async {
19 | // _showAds.showInerstitial();
20 | Navigator.push(
21 | context,
22 | MaterialPageRoute(
23 | builder: (context) => Video_Player(
24 | file: file,
25 | ),
26 | ),
27 | );
28 | },
29 | child: Padding(
30 | padding: const EdgeInsets.all(8.0),
31 | child: Icon(
32 | Icons.play_arrow,
33 | color: Colors.white,
34 | ),
35 | ),
36 | ),
37 | );
38 | }
39 | }
40 |
41 |
--------------------------------------------------------------------------------
/DownloadIT/lib/actions/actions.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class UpdateStatusAction {
4 | final String status;
5 |
6 |
7 | UpdateStatusAction(this.status);
8 |
9 | @override
10 | String toString() {
11 | return 'UpdateStatusAction{status: $status}';
12 | }
13 | }
14 |
15 | class StartDownloadAction {
16 | final String url;
17 | final BuildContext context;
18 |
19 | StartDownloadAction(this.url, this.context);
20 |
21 | @override
22 | String toString() {
23 | return 'StartDownloadAction';
24 | }
25 | }
26 |
27 | class StopDownloadAction {
28 | @override
29 | String toString() {
30 | return 'StopDownloadAction';
31 | }
32 | }
33 |
34 | class OpenDialogAction {
35 | final String title;
36 | final String body;
37 | final BuildContext context;
38 |
39 | OpenDialogAction({
40 | @required this.title,
41 | @required this.body,
42 | @required this.context,
43 | });
44 |
45 | @override
46 | String toString() {
47 | return 'OpenDialogAction{title: $title, body: $body}';
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/DownloadIT/lib/constants/appConstant.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | double screenHeightSize(double size, BuildContext context) {
4 | return size * MediaQuery.of(context).size.height / 650.0;
5 | }
6 |
7 | double screenWidthSize(double size, BuildContext context) {
8 | return size * MediaQuery.of(context).size.width / 400.0;
9 | }
10 |
11 | Widget screenAppBar(String screenName) {
12 | return AppBar(
13 | centerTitle: true,
14 | title: Text(
15 | screenName,
16 | style: new TextStyle(
17 | fontFamily: 'Billabong',
18 | fontSize: 34,
19 | ),
20 | ),
21 | backgroundColor: Colors.white,
22 | elevation: 0,
23 | );
24 | }
25 |
26 | Widget mySnackBar(BuildContext context, String msg) {
27 | return SnackBar(
28 | content: Text(msg),
29 | backgroundColor: Theme.of(context).accentColor,
30 | duration: Duration(seconds: 1),
31 | );
32 | }
33 |
34 | class MyButton extends StatelessWidget {
35 | final String text;
36 | final Function onPressed;
37 | final Color color;
38 | final EdgeInsets padding;
39 |
40 | MyButton({this.text, this.onPressed, this.color, this.padding});
41 |
42 | @override
43 | Widget build(BuildContext context) {
44 | return RaisedButton(
45 | color: (color != null) ? color : Colors.blueAccent,
46 | highlightColor: Theme.of(context).accentColor,
47 | disabledColor: Theme.of(context).primaryColor,
48 | child: Padding(
49 | padding: (padding != null) ? padding : EdgeInsets.all(15.0),
50 | child: Text((text != null) ? text : "Button"),
51 | ),
52 | onPressed: onPressed,
53 | );
54 | }
55 | }
56 |
57 |
--------------------------------------------------------------------------------
/DownloadIT/lib/constants/appTheme.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class AppTheme {
4 | AppTheme._();
5 |
6 | static const Color white = Color(0xFFFFFFFF);
7 | static const Color grey = Color(0xFF3A5160);
8 | static const String fontName = 'WorkSans';
9 |
10 | static const TextTheme textTheme = TextTheme(
11 | headline4: display1,
12 | headline5: headline,
13 | headline6: title,
14 | subtitle2: subtitle,
15 | bodyText1: body2,
16 | bodyText2: body1,
17 | caption: caption,
18 | );
19 |
20 | static const TextStyle display1 = TextStyle(
21 | // h4 -> display1
22 | fontFamily: fontName,
23 | fontWeight: FontWeight.bold,
24 | fontSize: 36,
25 | letterSpacing: 0.4,
26 | height: 0.9,
27 | );
28 |
29 | static const TextStyle headline = TextStyle(
30 | // h5 -> headline
31 | fontFamily: fontName,
32 | fontWeight: FontWeight.bold,
33 | fontSize: 24,
34 | letterSpacing: 0.27,
35 | );
36 |
37 | static const TextStyle title = TextStyle(
38 | // h6 -> title
39 | fontFamily: fontName,
40 | fontWeight: FontWeight.bold,
41 | fontSize: 16,
42 | letterSpacing: 0.18,
43 | );
44 |
45 | static const TextStyle subtitle = TextStyle(
46 | // subtitle2 -> subtitle
47 | fontFamily: fontName,
48 | fontWeight: FontWeight.w400,
49 | fontSize: 14,
50 | letterSpacing: -0.04,
51 | );
52 |
53 | static const TextStyle body2 = TextStyle(
54 | // body1 -> body2
55 | fontFamily: fontName,
56 | fontWeight: FontWeight.w400,
57 | fontSize: 14,
58 | letterSpacing: 0.2,
59 | );
60 |
61 | static const TextStyle body1 = TextStyle(
62 | // body2 -> body1
63 | fontFamily: fontName,
64 | fontWeight: FontWeight.w400,
65 | fontSize: 16,
66 | letterSpacing: -0.05,
67 | );
68 |
69 | static const TextStyle caption = TextStyle(
70 | // Caption -> caption
71 | fontFamily: fontName,
72 | fontWeight: FontWeight.w400,
73 | fontSize: 12,
74 | letterSpacing: 0.2, // was lightText
75 | );
76 | }
77 |
--------------------------------------------------------------------------------
/DownloadIT/lib/effects/effects.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'dart:convert';
3 | import 'dart:io';
4 | import 'package:flutter/cupertino.dart';
5 | import 'package:flutter/material.dart';
6 | import 'package:flutter_ffmpeg/flutter_ffmpeg.dart';
7 | import 'package:flutter_redux/flutter_redux.dart';
8 | import 'package:image_gallery_saver/image_gallery_saver.dart';
9 | import 'package:path_provider/path_provider.dart';
10 | import 'package:permission_handler/permission_handler.dart';
11 | import 'package:reddit_video_downloader/actions/actions.dart';
12 | import 'package:reddit_video_downloader/models/app_state.dart';
13 | import 'package:reddit_video_downloader/utils.dart';
14 | import 'package:redux_epics/redux_epics.dart';
15 | import 'package:http/http.dart' as http;
16 |
17 | Future _getDash(String redditUrl) async {
18 |
19 | redditUrl = Utils.removeQueryParams(redditUrl);
20 |
21 | Future fetch(String url) async {
22 | redditUrl = Utils.parseThreadUrl(url);
23 |
24 | try {
25 | final response = await http.get(redditUrl);
26 | debugPrint(response.statusCode.toString());
27 | if (response.statusCode == 302) {
28 | debugPrint('Location: ' + response.headers['Location']);
29 | return await fetch(response.headers['Location']);
30 | }
31 |
32 | return response.body;
33 | } catch (e) {
34 | return '{}';
35 | }
36 | }
37 |
38 | RedditUrls urlType = Utils.getUrlType(redditUrl);
39 | switch (urlType) {
40 |
41 | case RedditUrls.THREAD:
42 | dynamic data = jsonDecode(await fetch(redditUrl));
43 |
44 | try {
45 | String dashUrl = data[0]['data']['children'][0]['data']['secure_media']
46 | ['reddit_video']['dash_url'];
47 | return dashUrl;
48 | } catch (e) {
49 | return null;
50 | }
51 | break;
52 | case RedditUrls.VIDEO:
53 | case RedditUrls.VIDEO2:
54 | String threadUrl = await Utils.getThreadUrlFromVideoUrl(redditUrl);
55 | if (threadUrl == null) {
56 | return null;
57 | }
58 |
59 | String jsonData = await fetch(threadUrl);
60 | debugPrint('final url ' + threadUrl);
61 | debugPrint(jsonData);
62 | dynamic data = jsonDecode(jsonData);
63 |
64 | try {
65 | String dashUrl = data[0]['data']['children'][0]['data']['secure_media']
66 | ['reddit_video']['dash_url'];
67 | return dashUrl;
68 | } catch (e) {
69 | return null;
70 | }
71 | break;
72 | case RedditUrls.DASH:
73 | return redditUrl;
74 | break;
75 | case RedditUrls.INVALID:
76 | return null;
77 | break;
78 | }
79 |
80 |
81 |
82 | }
83 |
84 | Stream _startDownload(
85 | Stream actions, EpicStore store) {
86 | return actions
87 | .where((action) => action is StartDownloadAction)
88 | .asyncMap((action) async {
89 | void updateStatus(String status) {
90 | StoreProvider.of(action.context)
91 | .dispatch(new UpdateStatusAction(status));
92 | }
93 |
94 | void openDialog(String title, String body) {
95 | StoreProvider.of(action.context).dispatch(new OpenDialogAction(
96 | title: title, body: body, context: action.context));
97 | }
98 |
99 | debugPrint('download');
100 | updateStatus('Starting download');
101 | String url = action.url;
102 |
103 | if (url.isEmpty) {
104 | openDialog('Failure', 'Empty URL.');
105 | return new StopDownloadAction();
106 | }
107 |
108 | PermissionStatus permission = await PermissionHandler()
109 | .checkPermissionStatus(PermissionGroup.storage);
110 |
111 | if (permission != PermissionStatus.granted) {
112 | Map permissions =
113 | await PermissionHandler()
114 | .requestPermissions([PermissionGroup.storage]);
115 | debugPrint(permissions.toString());
116 | var status = permissions[PermissionGroup.storage];
117 |
118 | if (status != PermissionStatus.granted) {
119 | openDialog('Insufficient permissions',
120 | 'We need the storage permission to be able to save your video.');
121 | debugPrint('access denied');
122 | return new StopDownloadAction();
123 | }
124 | }
125 |
126 | updateStatus('Getting DASH information');
127 | String dashUrl = await _getDash(url);
128 | if (dashUrl == null) {
129 | openDialog(
130 | 'Failure', 'The URL might be invalid.');
131 | return new StopDownloadAction();
132 | }
133 |
134 | debugPrint(dashUrl);
135 |
136 | updateStatus('In progress...');
137 | final FlutterFFmpeg ffmpeg = new FlutterFFmpeg();
138 | final FlutterFFmpegConfig ffmpegConfig = new FlutterFFmpegConfig();
139 | final Directory directory = await getApplicationDocumentsDirectory();
140 |
141 | String path = directory.path;
142 |
143 | String fileName = 'temp.mp4';
144 |
145 | debugPrint('Path: ' + path);
146 | updateStatus('In progress....');
147 |
148 | ffmpegConfig.resetStatistics();
149 | ffmpegConfig.disableLogs();
150 | ffmpegConfig.enableStatisticsCallback((int time,
151 | int size,
152 | double bitrate,
153 | double speed,
154 | int videoFrameNumber,
155 | double videoQuality,
156 | double videoFps) {
157 | updateStatus(
158 | 'time: $time, size: $size, bitrate: $bitrate, speed: $speed, videoFrameNumber: $videoFrameNumber, videoQuality: $videoQuality, videoFps: $videoFps');
159 | });
160 |
161 | int code =
162 | await ffmpeg.execute('-y -i $dashUrl -codec copy $path/$fileName');
163 | if (code == 0) {
164 | debugPrint('success');
165 | debugPrint('saving to $path/$fileName');
166 |
167 | final result = await ImageGallerySaver.saveFile('$path/$fileName');
168 | new File('$path/$fileName').delete();
169 | debugPrint(result);
170 | updateStatus('Success');
171 | await Future.delayed(Duration(seconds: 1));
172 | openDialog('Success', 'Your video was downloaded.\nSaved to gallery.');
173 | return new StopDownloadAction();
174 | } else {
175 | debugPrint('failure');
176 | updateStatus('Error');
177 | debugPrint(code.toString());
178 | openDialog('Failure', 'Something happened when downloading the video.');
179 | return new StopDownloadAction();
180 | }
181 | });
182 | }
183 |
184 | Stream _openDialog(
185 | Stream actions, EpicStore store) {
186 | return actions
187 | .where((action) => action is OpenDialogAction)
188 | .asyncMap((action) async {
189 | showDialog(
190 | context: action.context,
191 | barrierDismissible: false,
192 | builder: (BuildContext context) {
193 | return AlertDialog(
194 | title: Text(action.title),
195 | content: SingleChildScrollView(
196 | child: Text(action.body),
197 | ),
198 | actions: [
199 | FlatButton(
200 | child: Text('Close'),
201 | onPressed: Navigator.of(context).pop,
202 | )
203 | ],
204 | );
205 | });
206 | });
207 | }
208 |
209 | final epic = combineEpics([_startDownload, _openDialog]);
210 |
--------------------------------------------------------------------------------
/DownloadIT/lib/helper/AdsHelper.dart:
--------------------------------------------------------------------------------
1 |
2 |
3 | class AdsHelper
4 | {
5 | static final String appID = "ca-app-pub-3940256099942544~3347511713";
6 | static final String bannerAds = "ca-app-pub-3940256099942544/6300978111";
7 | static final String interstitialAds = "ca-app-pub-3940256099942544/8691691433";
8 | static const String nativeAds = "ca-app-pub-3940256099942544/1044960115";
9 |
10 | }
--------------------------------------------------------------------------------
/DownloadIT/lib/helper/ShowAds.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'package:firebase_admob/firebase_admob.dart';
3 | import 'package:flutter/cupertino.dart';
4 | import 'package:flutter_native_admob/flutter_native_admob.dart';
5 | import 'package:flutter_native_admob/native_admob_controller.dart';
6 | import 'package:reddit_video_downloader/helper/AdsHelper.dart';
7 |
8 | class ShowAds
9 | {
10 | ShowAds({this.adUnitID});
11 | static const String testDevice = 'MobileId';
12 | //static InterstitialAd _interstitialAd;
13 | final _nativeAdController = NativeAdmobController();
14 | final adUnitID;
15 | static const MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo(
16 | testDevices: testDevice != null ? [testDevice] : null,
17 | nonPersonalizedAds: true,
18 | keywords: ['video', 'download'],
19 | );
20 | InterstitialAd createInterstitialAd() {
21 | return InterstitialAd(
22 | adUnitId: AdsHelper.interstitialAds,
23 | //Change Interstitial AdUnitId with Admob ID
24 | targetingInfo: targetingInfo,
25 | listener: (MobileAdEvent event) {
26 | print("IntersttialAd $event");
27 | });
28 | }
29 | showInerstitial()
30 | {
31 | createInterstitialAd()
32 | ..load()
33 | ..show();
34 | }
35 |
36 | showNative()
37 | {
38 | return NativeAdmob(
39 | // Your ad unit id
40 | adUnitID: adUnitID,
41 | controller: _nativeAdController,
42 | type: NativeAdmobType.full,
43 | error: CupertinoActivityIndicator(),
44 | );
45 | }
46 | _showBanner()
47 | {
48 |
49 | }
50 | }
--------------------------------------------------------------------------------
/DownloadIT/lib/helper/VideoCard.dart:
--------------------------------------------------------------------------------
1 |
2 |
3 | import 'dart:io';
4 |
5 | import 'package:flutter/material.dart';
6 | import 'package:reddit_video_downloader/screens/Thumbnails.dart';
7 | import 'package:reddit_video_downloader/screens/VideoPlayer.dart';
8 | import 'package:reddit_video_downloader/screens/galleryScreenReddit.dart';
9 | import 'package:share_extend/share_extend.dart';
10 |
11 | class VideoCard extends StatefulWidget {
12 | VideoCard({this.file, this.info});
13 |
14 | final File file;
15 | final Widget info;
16 |
17 | @override
18 | _VideoCardState createState() => _VideoCardState();
19 | }
20 |
21 | class _VideoCardState extends State {
22 | BoxDecoration _buildShadowAndRoundedCorners() {
23 | return BoxDecoration(
24 | color: Colors.white.withOpacity(0.4),
25 | borderRadius: BorderRadius.circular(10.0),
26 | boxShadow: [
27 | BoxShadow(
28 | spreadRadius: 2.0,
29 | blurRadius: 10.0,
30 | color: Colors.black26,
31 | ),
32 | ],
33 | );
34 | }
35 |
36 | Widget _buildThumbnail() {
37 | return ClipRRect(
38 | borderRadius: BorderRadius.circular(8.0),
39 | child: Stack(
40 | children: [
41 | VideoItem(file: widget.file,),
42 | Positioned(
43 | bottom: 12.0,
44 | right: 12.0,
45 | child: _buildPlayButton(),
46 | ),
47 | ],
48 | ),
49 | );
50 | }
51 |
52 | Widget _buildPlayButton() {
53 | return Material(
54 | color: Colors.black87,
55 | type: MaterialType.circle,
56 | child: InkWell(
57 | onTap: () async {
58 | Navigator.push(
59 | context,
60 | MaterialPageRoute(
61 | builder: (context) => Video_Player(
62 | file: widget.file,
63 | ),
64 | ),
65 | );
66 | },
67 | child: Padding(
68 | padding: const EdgeInsets.all(8.0),
69 | child: Icon(
70 | Icons.play_arrow,
71 | color: Colors.white,
72 | ),
73 | ),
74 | ),
75 | );
76 | }
77 |
78 |
79 | @override
80 | Widget build(BuildContext context) {
81 | return Container(
82 | width: 175.0,
83 | padding: const EdgeInsets.all(8.0),
84 | margin: const EdgeInsets.symmetric(horizontal: 4.0, vertical: 12.0),
85 | decoration: _buildShadowAndRoundedCorners(),
86 | child: Flexible(flex: 1, child: _buildThumbnail()),
87 | );
88 | }
89 | }
--------------------------------------------------------------------------------
/DownloadIT/lib/helper/app_animations.dart:
--------------------------------------------------------------------------------
1 |
2 | class AppAnimations {
3 | static final String fb = "assets/icon/facebook.png";
4 | static final String reddit = "assets/icon/reddit.png";
5 | static final String tiktok = "assets/icon/tiktok.png";
6 | static final String insta = "assets/icon/instagram.png";
7 | static final String whatsapp = "assets/icon/whatsapp.png";
8 | static final String download = "assets/icon/download.png";
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/DownloadIT/lib/helper/customDrawer/drawerUserController.dart:
--------------------------------------------------------------------------------
1 | import 'homeDrawer.dart';
2 | import 'package:flutter/material.dart';
3 |
4 | class DrawerUserController extends StatefulWidget {
5 | final double drawerWidth;
6 | final Function(DrawerIndex) onDrawerCall;
7 | final Widget screenView;
8 | final Function(AnimationController) animationController;
9 | final Function(bool) drawerIsOpen;
10 | final AnimatedIconData animatedIconData;
11 | final Widget menuView;
12 | final DrawerIndex screenIndex;
13 |
14 | const DrawerUserController({
15 | Key key,
16 | this.drawerWidth: 200,
17 | this.onDrawerCall,
18 | this.screenView,
19 | this.animationController,
20 | this.animatedIconData: AnimatedIcons.arrow_menu,
21 | this.menuView,
22 | this.drawerIsOpen,
23 | this.screenIndex,
24 | }) : super(key: key);
25 | @override
26 | _DrawerUserControllerState createState() => _DrawerUserControllerState();
27 | }
28 |
29 | class _DrawerUserControllerState extends State
30 | with TickerProviderStateMixin {
31 | ScrollController scrollController;
32 | AnimationController iconAnimationController;
33 | AnimationController animationController;
34 |
35 | double scrolloffset = 0.0;
36 | bool isSetDawer = false;
37 |
38 | @override
39 | void initState() {
40 | animationController = AnimationController(
41 | duration: Duration(milliseconds: 2000), vsync: this);
42 | iconAnimationController =
43 | AnimationController(vsync: this, duration: Duration(milliseconds: 0));
44 | iconAnimationController.animateTo(1.0,
45 | duration: Duration(milliseconds: 0), curve: Curves.fastOutSlowIn);
46 | scrollController =
47 | ScrollController(initialScrollOffset: widget.drawerWidth);
48 | scrollController
49 | ..addListener(() {
50 | if (scrollController.offset <= 0) {
51 | if (scrolloffset != 1.0) {
52 | setState(() {
53 | scrolloffset = 1.0;
54 | try {
55 | widget.drawerIsOpen(true);
56 | } catch (e) {}
57 | });
58 | }
59 | iconAnimationController.animateTo(0.0,
60 | duration: Duration(milliseconds: 300), curve: Curves.linear);
61 | } else if (scrollController.offset > 0 &&
62 | scrollController.offset < widget.drawerWidth) {
63 | iconAnimationController.animateTo(
64 | (scrollController.offset * 100 / (widget.drawerWidth)) / 100,
65 | duration: Duration(milliseconds: 300),
66 | curve: Curves.linear);
67 | } else if (scrollController.offset <= widget.drawerWidth) {
68 | if (scrolloffset != 0.0) {
69 | setState(() {
70 | scrolloffset = 0.0;
71 | try {
72 | widget.drawerIsOpen(false);
73 | } catch (e) {}
74 | });
75 | }
76 | iconAnimationController.animateTo(1.0,
77 | duration: Duration(milliseconds: 0), curve: Curves.linear);
78 | }
79 | });
80 | getInitState();
81 | super.initState();
82 | }
83 |
84 | Future getInitState() async {
85 | await Future.delayed(const Duration(milliseconds: 300));
86 | try {
87 | widget.animationController(iconAnimationController);
88 | } catch (e) {}
89 | await Future.delayed(const Duration(milliseconds: 100));
90 | scrollController.jumpTo(
91 | widget.drawerWidth,
92 | );
93 | setState(() {
94 | isSetDawer = true;
95 | });
96 | return true;
97 | }
98 |
99 | @override
100 | Widget build(BuildContext context) {
101 | return Scaffold(
102 | body: SingleChildScrollView(
103 | controller: scrollController,
104 | scrollDirection: Axis.horizontal,
105 | physics: PageScrollPhysics(parent: ClampingScrollPhysics()),
106 | // scrolloffset == 1.0
107 | // ? PageScrollPhysics(parent: ClampingScrollPhysics())
108 | // : PageScrollPhysics(parent: NeverScrollableScrollPhysics()),
109 | child: Opacity(
110 | opacity: isSetDawer ? 1 : 0,
111 | child: SizedBox(
112 | height: MediaQuery.of(context).size.height,
113 | width: MediaQuery.of(context).size.width + widget.drawerWidth,
114 | child: Row(
115 | children: [
116 | SizedBox(
117 | width: widget.drawerWidth,
118 | height: MediaQuery.of(context).size.height,
119 | child: AnimatedBuilder(
120 | animation: iconAnimationController,
121 | builder: (BuildContext context, Widget child) {
122 | return new Transform(
123 | transform: new Matrix4.translationValues(
124 | scrollController.offset, 0.0, 0.0),
125 | child: SizedBox(
126 | height: MediaQuery.of(context).size.height,
127 | width: widget.drawerWidth,
128 | child: HomeDrawer(
129 | screenIndex: widget.screenIndex == null
130 | ? DrawerIndex.Home
131 | : widget.screenIndex,
132 | iconAnimationController: iconAnimationController,
133 | callBackIndex: (DrawerIndex indexType) {
134 | onDrawerClick();
135 | try {
136 | widget.onDrawerCall(indexType);
137 | } catch (e) {}
138 | },
139 | ),
140 | ),
141 | );
142 | },
143 | ),
144 | ),
145 | SizedBox(
146 | width: MediaQuery.of(context).size.width,
147 | height: MediaQuery.of(context).size.height,
148 | child: Container(
149 | decoration: BoxDecoration(
150 | boxShadow: [
151 | BoxShadow(
152 | color: Theme.of(context).accentColor.withOpacity(0.5),
153 | blurRadius: 24),
154 | ],
155 | ),
156 | child: Stack(
157 | children: [
158 | IgnorePointer(
159 | ignoring: scrolloffset == 1 ? true : false,
160 | child: widget.screenView == null
161 | ? Container(
162 | color: Colors.white,
163 | )
164 | : widget.screenView,
165 | ),
166 | scrolloffset == 1.0
167 | ? InkWell(
168 | onTap: () {
169 | onDrawerClick();
170 | },
171 | )
172 | : SizedBox(),
173 | Padding(
174 | padding: EdgeInsets.only(
175 | top: MediaQuery.of(context).padding.top + 8,
176 | left: 8),
177 | child: SizedBox(
178 | width: AppBar().preferredSize.height - 8,
179 | height: AppBar().preferredSize.height - 8,
180 | child: Material(
181 | color: Colors.transparent,
182 | child: InkWell(
183 | borderRadius: new BorderRadius.circular(
184 | AppBar().preferredSize.height),
185 | child: Center(
186 | child: widget.menuView != null
187 | ? widget.menuView
188 | : AnimatedIcon(
189 | icon: widget.animatedIconData != null
190 | ? widget.animatedIconData
191 | : AnimatedIcons.arrow_menu,
192 | progress: iconAnimationController),
193 | ),
194 | onTap: () {
195 | FocusScope.of(context)
196 | .requestFocus(FocusNode());
197 | onDrawerClick();
198 | },
199 | ),
200 | ),
201 | ),
202 | ),
203 | ],
204 | ),
205 | ),
206 | ),
207 | ],
208 | ),
209 | ),
210 | ),
211 | ),
212 | );
213 | }
214 |
215 | void onDrawerClick() {
216 | if (scrollController.offset != 0.0) {
217 | scrollController.animateTo(
218 | 0.0,
219 | duration: Duration(milliseconds: 400),
220 | curve: Curves.fastOutSlowIn,
221 | );
222 | } else {
223 | scrollController.animateTo(
224 | widget.drawerWidth,
225 | duration: Duration(milliseconds: 400),
226 | curve: Curves.fastOutSlowIn,
227 | );
228 | }
229 | }
230 | }
231 |
--------------------------------------------------------------------------------
/DownloadIT/lib/helper/showToast.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:fluttertoast/fluttertoast.dart';
3 |
4 | class showToast
5 | {
6 | FToast fToast;
7 |
8 | init(BuildContext context)
9 | {
10 | fToast = FToast(context);
11 | }
12 | show(String msg)
13 | {
14 | fToast.showToast(
15 | child: Text(msg),
16 | gravity: ToastGravity.BOTTOM,
17 | toastDuration: Duration(seconds: 1),
18 | );
19 | }
20 |
21 | }
--------------------------------------------------------------------------------
/DownloadIT/lib/helper/theme_changer.dart:
--------------------------------------------------------------------------------
1 |
2 |
3 | import 'package:flutter/material.dart';
4 |
5 | class ThemeBuilder extends StatefulWidget {
6 | final Widget Function(BuildContext context, Brightness brightness) builder;
7 |
8 | final Brightness defaultBrightness;
9 |
10 | ThemeBuilder({this.builder, this.defaultBrightness});
11 |
12 | @override
13 | _ThemeBuilderState createState() => _ThemeBuilderState();
14 |
15 | static _ThemeBuilderState of(BuildContext context) {
16 |
17 | return context.ancestorStateOfType(const TypeMatcher<_ThemeBuilderState>());
18 | }
19 | }
20 |
21 | class _ThemeBuilderState extends State {
22 | Brightness _brightness;
23 |
24 | @override
25 | void initState() {
26 | super.initState();
27 |
28 | _brightness = widget.defaultBrightness;
29 |
30 | if (mounted) setState(() {});
31 | }
32 |
33 | void changeTheme() {
34 | setState(() {
35 | _brightness =
36 | _brightness == Brightness.dark ? Brightness.light : Brightness.dark;
37 | });
38 | }
39 |
40 | // Brightness getCurrentTheme() {
41 | // return _brightness;
42 | // }
43 |
44 | @override
45 | Widget build(BuildContext context) {
46 | return widget.builder(context, _brightness);
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/DownloadIT/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:flutter/services.dart';
4 | import 'package:flutter_downloader/flutter_downloader.dart';
5 | import 'package:reddit_video_downloader/effects/effects.dart';
6 | import 'package:reddit_video_downloader/models/app_state.dart';
7 | import 'package:reddit_video_downloader/reduers/app_state_reducer.dart';
8 | import 'package:reddit_video_downloader/screens/home/home.dart';
9 | import 'package:flutter_redux/flutter_redux.dart';
10 | import 'package:redux/redux.dart';
11 | import 'package:redux_epics/redux_epics.dart';
12 |
13 | var _epicMiddleware = new EpicMiddleware(epic);
14 |
15 | void main() async{
16 | WidgetsFlutterBinding.ensureInitialized();
17 | SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]);
18 | await FlutterDownloader.initialize(debug: true // optional: set false to disable printing logs to console
19 | );
20 | final store = new Store(
21 | appReducer,
22 | initialState: AppState.initial(),
23 | middleware: [_epicMiddleware],
24 | );
25 | runApp(MyApp(store: store));
26 | }
27 |
28 | class MyApp extends StatelessWidget {
29 | final Store store;
30 |
31 | MyApp({this.store});
32 |
33 | @override
34 | Widget build(BuildContext context) {
35 | return StoreProvider(
36 | store: store,
37 | child: MaterialApp(
38 | debugShowCheckedModeBanner: false,
39 | title: 'DownloadIt',
40 | theme: ThemeData(
41 | brightness: Brightness.light,
42 | backgroundColor: Colors.white,
43 | primaryColor: Colors.white,
44 | textTheme: TextTheme(
45 | headline5: TextStyle(fontSize: 21),
46 | ),
47 | buttonTheme: ButtonThemeData(
48 | buttonColor: Colors.white,
49 | textTheme: ButtonTextTheme.primary,
50 | shape: RoundedRectangleBorder(
51 | borderRadius: BorderRadius.circular(100),
52 | side: BorderSide(color: Colors.blueAccent)
53 | ),
54 | ),
55 | appBarTheme: AppBarTheme(
56 | color: Colors.white,
57 | )),
58 | home:Home()
59 | ),
60 | );
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/DownloadIT/lib/models/app_state.dart:
--------------------------------------------------------------------------------
1 | import 'package:meta/meta.dart';
2 | import 'package:reddit_video_downloader/models/download.dart';
3 |
4 | @immutable
5 | class AppState {
6 | final Download download;
7 |
8 | AppState({this.download = const Download()});
9 |
10 | factory AppState.initial() => AppState(
11 | download: new Download(isDownloading: false, status: ''));
12 |
13 | AppState copyWith({Download download}) {
14 | return AppState(download: download ?? this.download);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/DownloadIT/lib/models/download.dart:
--------------------------------------------------------------------------------
1 | import 'package:meta/meta.dart';
2 |
3 | @immutable
4 | class Download {
5 | final bool isDownloading;
6 | final String status;
7 |
8 | const Download({this.isDownloading, this.status});
9 |
10 | Download copyWith({bool isDownloading, String status}) {
11 | return Download(
12 | isDownloading: isDownloading ?? this.isDownloading,
13 | status: status ?? this.status,
14 | );
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/DownloadIT/lib/reduers/app_state_reducer.dart:
--------------------------------------------------------------------------------
1 | import 'package:reddit_video_downloader/models/app_state.dart';
2 | import 'package:reddit_video_downloader/reduers/download_reducer.dart';
3 |
4 | AppState appReducer(AppState state, action) {
5 | return AppState(
6 | download: downloadReducer(state.download, action)
7 | );
8 | }
9 |
--------------------------------------------------------------------------------
/DownloadIT/lib/reduers/download_reducer.dart:
--------------------------------------------------------------------------------
1 | import 'package:reddit_video_downloader/actions/actions.dart';
2 | import 'package:reddit_video_downloader/models/download.dart';
3 | import 'package:redux/redux.dart';
4 |
5 | final downloadReducer = combineReducers([
6 | TypedReducer(_updateStatus),
7 | TypedReducer(_startDownload),
8 | TypedReducer(_stopDownload),
9 | ]);
10 |
11 | Download _updateStatus(Download state, UpdateStatusAction action) {
12 | return state.copyWith(status: action.status);
13 | }
14 |
15 | Download _startDownload(Download state, StartDownloadAction action) {
16 | return state.copyWith(isDownloading: true);
17 | }
18 |
19 | Download _stopDownload(Download state, StopDownloadAction action) {
20 | return state.copyWith(isDownloading: false);
21 | }
22 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/About.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:reddit_video_downloader/constants/appConstant.dart';
3 | import 'package:share/share.dart';
4 | import 'package:url_launcher/url_launcher.dart';
5 |
6 | class About extends StatelessWidget {
7 | Future _lauchUrl(String url) async {
8 | if (await canLaunch(url)) {
9 | await launch(
10 | url,
11 | enableJavaScript: true,
12 | forceWebView: false,
13 | forceSafariVC: false,
14 | );
15 | } else {
16 | print('Can\'t Lauch url');
17 | }
18 | }
19 | @override
20 | Widget build(BuildContext context) {
21 | return Scaffold(
22 | appBar: screenAppBar('About us'),
23 | body: SingleChildScrollView(
24 | physics: BouncingScrollPhysics(),
25 | child: Column(
26 | crossAxisAlignment: CrossAxisAlignment.center,
27 | mainAxisAlignment: MainAxisAlignment.spaceAround,
28 | children: [
29 | Container(
30 | padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
31 | child: Image.asset(
32 | "assets/images/rvd.png",
33 | scale: 2.0,
34 | ),
35 | ),
36 | SizedBox(height: 20,),
37 | Container(
38 | padding: EdgeInsets.symmetric(horizontal: 15,vertical: 10),
39 | alignment: Alignment.center,
40 | child: Hero(
41 | tag: 'tagged',
42 | child: Text('Reddit Video Downloader is a free app to download HD Videos with audio, Reddit video downloader helps you to save your favorite video to your gallery.\n if you loved this free video downloader please share it with your friends and rate us on Playstore. ',style:
43 | TextStyle( fontFamily: 'WorkSans',fontSize: 15),textAlign: TextAlign.center,),
44 | ),
45 | ),
46 | SizedBox(height: 20,),
47 | Card(
48 | child: Column(
49 | children: [
50 | GestureDetector(child: ListTile(leading: Icon(Icons.share),title: Text('Share the App',style: TextStyle( fontFamily: 'WorkSans'),),),
51 | onTap: (){
52 | Share.share('Download Stories,Videos,Status and much more in One Click using Reddit Video Downloader App.\n\n Checkout the Link below also share it with your Friends.\n https://play.google.com/store/apps/details?id=com.downloading.social_media');
53 |
54 | },),
55 | GestureDetector(child: ListTile(leading: Icon(Icons.star),title: Text('Rate App App',style: TextStyle( fontFamily: 'WorkSans'),),),
56 | onTap: (){
57 | _lauchUrl('https://play.google.com/store/apps/details?id=com.downloading.social_media');
58 | },),
59 | GestureDetector(child: ListTile(leading: Icon(Icons.more),title: Text('More App',style: TextStyle( fontFamily: 'WorkSans'),),),
60 | onTap: (){
61 | _lauchUrl('https://play.google.com/store/apps/developer?id=HD+Video+downloader+-+Video+to+mp3+converter');
62 | },),
63 | ],
64 | ),
65 | ),
66 |
67 | ],
68 | ),
69 | ),
70 | );
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/ImagesDetails.dart:
--------------------------------------------------------------------------------
1 |
2 | import 'package:flutter/cupertino.dart';
3 | import 'package:flutter/material.dart';
4 | import 'package:reddit_video_downloader/screens/galleryScreen.dart';
5 | import 'package:share_extend/share_extend.dart';
6 |
7 | class Images extends StatefulWidget {
8 | final file;
9 | Images({this.file});
10 | @override
11 | _ImagesState createState() => _ImagesState();
12 | }
13 |
14 | class _ImagesState extends State {
15 | bool choice = true;
16 | @override
17 | Widget build(BuildContext context) {
18 | return Scaffold(
19 | body: Stack(
20 | fit: StackFit.expand,
21 | children: [
22 | Hero(
23 | tag: "image",
24 | child: Image.file(widget.file,fit: choice ? BoxFit.fill : BoxFit.cover,)),
25 | Container(
26 | padding: const EdgeInsets.all(16.0),
27 | width: double.infinity,
28 | height: double.infinity,
29 | child: Column(
30 | crossAxisAlignment: CrossAxisAlignment.start,
31 | children: [
32 | SizedBox(height: 20.0),
33 | Row(
34 | mainAxisAlignment: MainAxisAlignment.spaceBetween,
35 | children: [
36 | IconButton(
37 | color: Colors.white,
38 | icon: Icon(Icons.arrow_back),
39 | onPressed: () => Navigator.pop(context),
40 | ),
41 | Padding(
42 | padding: EdgeInsets.only(right: 20.0),
43 | child: IconButton(icon: Icon(Icons.share),color: Colors.white, onPressed: (){
44 | ShareExtend.share(widget.file.path, "video");
45 | },),
46 | ),
47 | Padding(
48 | padding: EdgeInsets.only(right: 20.0),
49 | child: IconButton(icon : Icon(Icons.delete),color: Colors.white, onPressed: ()async {
50 | await showDialog(
51 | context: context,
52 | builder: (context) {
53 | return AlertDialog(
54 | title: Text('Warning'),
55 | content: Text(
56 | 'Are you sure you want to delete this video. '),
57 | actions: [
58 | FlatButton(
59 | child: Text('Cancel'),
60 | onPressed: Navigator.of(context).pop,
61 | ),
62 | FlatButton(
63 | child: Text('Confirm'),
64 | onPressed: () {
65 | widget.file.delete();
66 | Navigator.pushReplacement(context, MaterialPageRoute(builder: (context)=>GalleryScreen()));
67 | }),
68 | ],
69 | );
70 | },
71 | );
72 | // setState(() {});
73 | },),
74 | ),
75 | IconButton(
76 | color: Colors.white,
77 | icon: Icon(choice ? Icons.fullscreen_exit : Icons.fullscreen),
78 | onPressed: (){
79 | setState(() {
80 | choice = !choice;
81 | });
82 | },
83 | ),
84 | ],
85 | ),
86 | Spacer(),
87 | SizedBox(height: 10.0),
88 | // Hero(
89 | // tag: "title$index",
90 | // child: Material(
91 | // type: MaterialType.transparency,
92 | // child: Text(dummy[index]["title"], style: TextStyle(
93 | // color: Colors.white,
94 | // fontSize: 18.0,
95 | // fontWeight: FontWeight.bold
96 | // ),),
97 | // ),
98 | // ),
99 | // SizedBox(height: 20.0),
100 | // Hero(
101 | // tag: "price$index",
102 | // child: Material(
103 | // type: MaterialType.transparency,
104 | // child: Text(dummy[index]['price'], textAlign: TextAlign.start, style: TextStyle(
105 | // fontSize: 30.0,
106 | // fontWeight: FontWeight.bold,
107 | // color: Colors.white
108 | // ),),
109 | // ),
110 | // ),
111 | SizedBox(height: 20.0),
112 | ],
113 | ),
114 | )
115 | ],
116 | ),
117 | );
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/Thumbnails.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:reddit_video_downloader/WidgetHelper/Playbtn.dart';
5 | import 'package:reddit_video_downloader/constants/appConstant.dart';
6 | import 'package:reddit_video_downloader/screens/VideoPlayer.dart';
7 | import 'package:video_player/video_player.dart';
8 |
9 | class VideoItem extends StatefulWidget {
10 | VideoItem({this.file});
11 | final File file;
12 | @override
13 | _VideoItemState createState() => _VideoItemState();
14 | }
15 |
16 | class _VideoItemState extends State {
17 | VideoPlayerController _controller;
18 |
19 | @override
20 | void initState() {
21 | super.initState();
22 | _controller = VideoPlayerController.file(widget.file)
23 | ..initialize().then((_) {
24 | setState(() {}); //when your thumbnail will show.
25 | });
26 | }
27 |
28 | @override
29 | void dispose() {
30 | super.dispose();
31 | _controller.dispose();
32 | }
33 |
34 | @override
35 | Widget build(BuildContext context) {
36 | return _controller.value.initialized
37 | ? Stack(
38 | children: [
39 | GestureDetector(
40 | onTap: () {
41 | Navigator.push(
42 | context,
43 | MaterialPageRoute(
44 | builder: (context) => Video_Player(
45 | file: widget.file,
46 | ),
47 | ),
48 | );
49 | },
50 | child: Container(
51 | height: screenWidthSize(120, context),
52 | width: screenWidthSize(120, context),
53 | decoration: BoxDecoration(
54 | shape: BoxShape.rectangle,
55 | color: Theme.of(context).primaryColor,
56 | ),
57 | child: VideoPlayer(_controller)),
58 | ),
59 | Align(
60 | alignment: Alignment.center,
61 | child: Padding(
62 | padding: EdgeInsets.all(4.0),
63 | child: Play(
64 | file: widget.file,
65 | ),
66 | ),
67 | ),
68 | ],
69 | )
70 | : Center(child: CircularProgressIndicator());
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/VideoPlayer.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:chewie/chewie.dart';
3 |
4 | import 'package:flutter/material.dart';
5 | import 'package:reddit_video_downloader/constants/appConstant.dart';
6 | import 'package:reddit_video_downloader/screens/galleryScreen.dart';
7 | import 'package:share_extend/share_extend.dart';
8 | import 'package:video_player/video_player.dart';
9 |
10 | class Video_Player extends StatefulWidget {
11 | final File file;
12 | Video_Player({this.file});
13 | // This will contain the URL/asset path which we want to play
14 | @override
15 | _Video_PlayerState createState() => _Video_PlayerState();
16 | }
17 |
18 | class _Video_PlayerState extends State {
19 | ChewieController _chewieController;
20 | VideoPlayerController videoPlayerController;
21 |
22 | @override
23 | void initState() {
24 | super.initState();
25 | // Wrapper on top of the videoPlayerController
26 | videoPlayerController = VideoPlayerController.file(widget.file);
27 | _chewieController = ChewieController(
28 | videoPlayerController: videoPlayerController,
29 | aspectRatio: 3 / 4,
30 |
31 | // Prepare the video to be played and display the first frame
32 | autoInitialize: true,
33 | looping: false,
34 | // Errors can occur for example when trying to play a video
35 | // from a non-existent URL
36 | errorBuilder: (context, errorMessage) {
37 | return Center(
38 | child: Icon(
39 | Icons.error,
40 | color: Colors.blue,
41 | ),
42 | );
43 | },
44 | );
45 | }
46 |
47 | @override
48 | Widget build(BuildContext context) {
49 | return Scaffold(
50 | appBar:AppBar(
51 |
52 | actions: [
53 | InkWell(
54 | child: Padding(
55 | padding: EdgeInsets.only(right: 20.0),
56 | child: Icon(Icons.share),
57 | ),
58 | onTap: () {
59 | ShareExtend.share(widget.file.path, "video");
60 | },
61 | ),
62 | InkWell(
63 | child: Padding(
64 | padding: EdgeInsets.only(right: 20.0),
65 | child: Icon(Icons.delete),
66 | ),
67 | onTap: () async {
68 | await showDialog(
69 | context: context,
70 | builder: (context) {
71 | return AlertDialog(
72 | title: Text('Warning'),
73 | content: Text(
74 | 'Are you sure you want to delete this video. '),
75 | actions: [
76 | FlatButton(
77 | child: Text('Cancel'),
78 | onPressed: Navigator.of(context).pop,
79 | ),
80 | FlatButton(
81 | child: Text('Confirm'),
82 | onPressed: () {
83 | widget.file.delete();
84 | Navigator.pushReplacement(context, MaterialPageRoute(builder: (context)=>GalleryScreen()));
85 | }),
86 | ],
87 | );
88 | },
89 | );
90 | // setState(() {});
91 | },
92 | )
93 | ],
94 | title: Text(
95 | 'Video Player',
96 | style: new TextStyle(
97 | fontFamily: 'Billabong',
98 | fontSize: 34,
99 | ),
100 | ),
101 | backgroundColor: Colors.white,
102 | elevation: 0,
103 | ),
104 | body: Padding(
105 | padding: const EdgeInsets.all(8.0),
106 | child: Chewie(
107 | controller: _chewieController,
108 | ),
109 | ),
110 | );
111 | }
112 |
113 | @override
114 | void dispose() {
115 | super.dispose();
116 | // IMPORTANT to dispose of all the used resources
117 | videoPlayerController.dispose();
118 | _chewieController.dispose();
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/facebookDownload/facebookData.dart:
--------------------------------------------------------------------------------
1 | import 'package:html/parser.dart';
2 | import 'package:http/http.dart';
3 |
4 | class FacebookData {
5 | static FacebookProfile _profileParsed = FacebookProfile();
6 |
7 | static Future postFromUrl(String profileUrl) async {
8 | String _temporaryData = '', _patternStart = '', _patternEnd = '';
9 | int _startInx = 0, _endInx = 1;
10 | Client _client = Client();
11 | Response _response;
12 | Map _postData = Map();
13 | var _document;
14 |
15 | try {
16 | _response = await _client.get('$profileUrl');
17 | _document = parse(_response.body);
18 | _document = _document.querySelectorAll('body');
19 | _temporaryData = _document[0].text;
20 | _temporaryData = _temporaryData.trim();
21 |
22 | _patternStart = 'permalinkURL:"';
23 | _patternEnd = '/"}],1],';
24 | _startInx = _temporaryData.indexOf(_patternStart) + _patternStart.length;
25 | _endInx = _temporaryData.indexOf(_patternEnd) + 1;
26 | _postData['postUrl'] = _temporaryData.substring(_startInx, _endInx);
27 |
28 | _patternStart = ',sd_src:';
29 | _patternEnd = '",hd_tag:';
30 | _startInx = _temporaryData.indexOf(_patternStart) + _patternStart.length + 1;
31 | _endInx = _temporaryData.indexOf(_patternEnd);
32 | _postData['videoSdUrl'] = _temporaryData.substring(_startInx, _endInx);
33 |
34 | _patternStart = ',hd_src:"';
35 | _patternEnd = '",sd_src:';
36 | _startInx = _temporaryData.indexOf(_patternStart) + _patternStart.length;
37 | _endInx = _temporaryData.indexOf(_patternEnd);
38 | _postData['videoHdUrl'] = _temporaryData.substring(_startInx, _endInx) != 'null' ? _temporaryData.substring(_startInx, _endInx) : _postData['videoSdUrl'];
39 |
40 | if (!_temporaryData.contains('audio:[]')) {
41 | _patternStart = 'audio:[{url:"';
42 | _patternEnd = '",start:0,end:';
43 | _startInx = _temporaryData.indexOf(_patternStart) + _patternStart.length;
44 | _endInx = _temporaryData.substring(_startInx).indexOf(_patternEnd) + _startInx;
45 | _postData['videoMp3Url'] = _temporaryData.substring(_startInx, _endInx);
46 | } else {
47 | _postData['videoMp3Url'] = '';
48 | }
49 |
50 | // _patternStart = ',i18n_reaction_count:"';
51 | // _patternEnd = '",important_reactors:';
52 | // _startInx = _temporaryData.indexOf(_patternStart) + _patternStart.length;
53 | // _endInx = _temporaryData.indexOf(_patternEnd);
54 | // _postData['likes'] = _temporaryData.substring(_startInx,_endInx);
55 |
56 | // _patternStart = ',i18n_comment_count:"';
57 | // _patternEnd = '",url:"';
58 | // _startInx = _temporaryData.indexOf(_patternStart) + _patternStart.length;
59 | // _endInx = _temporaryData.indexOf(_patternEnd);
60 | // _postData['commentsCount'] = _temporaryData.substring(_startInx,_endInx);
61 |
62 | // _patternStart = ',i18n_share_count:"';
63 | // _patternEnd = '",share_count:';
64 | // _startInx = _temporaryData.indexOf(_patternStart) + _patternStart.length;
65 | // _endInx = _temporaryData.indexOf(_patternEnd);
66 | // _postData['sharesCount'] = _temporaryData.substring(_startInx,_endInx);
67 |
68 | _profileParsed.postData = FacebookPost.fromMap(_postData);
69 | } catch (error) {
70 | print('[InstaData][storyFromUrl]: $error');
71 | }
72 |
73 | return _profileParsed;
74 | }
75 | }
76 |
77 | class FacebookProfile {
78 | FacebookPost postData;
79 |
80 | FacebookProfile({
81 | this.postData,
82 | });
83 | }
84 |
85 | class FacebookPost {
86 | String postUrl = '';
87 | String thumbnailUrl = '';
88 | String videoSdUrl = '';
89 | String videoHdUrl = '';
90 | String videoMp3Url = '';
91 | String description = '';
92 | String dateTime = '';
93 | int likes = 0;
94 | int commentsCount = 0;
95 | int sharesCount = 0;
96 | int videoViewsCount = 0;
97 |
98 | FacebookPost({
99 | this.postUrl,
100 | this.thumbnailUrl,
101 | this.videoSdUrl,
102 | this.videoHdUrl,
103 | this.videoMp3Url,
104 | this.description,
105 | this.dateTime,
106 | this.likes,
107 | this.commentsCount,
108 | this.sharesCount,
109 | this.videoViewsCount,
110 | });
111 |
112 | factory FacebookPost.fromMap(Map map) {
113 | return FacebookPost(
114 | postUrl: map['postUrl'] == null ? '' : map['postUrl'],
115 | thumbnailUrl: map['thumbnailUrl'] == null ? '' : map['thumbnailUrl'],
116 | videoSdUrl: map['videoSdUrl'],
117 | videoHdUrl: map['videoHdUrl'],
118 | videoMp3Url: map['videoMp3Url'],
119 | description: map['description'] == null ? '' : map['description'],
120 | dateTime: map['dateTime'] == null ? '' : map['dateTime'],
121 | likes: int.parse(map['likes'] == null ? '0' : map['likes']),
122 | commentsCount: int.parse(map['commentsCount'] == null ? '0' : map['commentsCount']),
123 | sharesCount: int.parse(map['sharesCount'] == null ? '0' : map['sharesCount']),
124 | videoViewsCount: int.parse(map['videoViewsCount'] == null ? '0' : map['videoViewsCount']),
125 | );
126 | }
127 | }
128 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/facebookDownload/galleryScreen.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:flutter/material.dart';
3 | import 'package:reddit_video_downloader/WidgetHelper/Playbtn.dart';
4 | import 'package:reddit_video_downloader/constants/appConstant.dart';
5 | import 'package:reddit_video_downloader/helper/AdsHelper.dart';
6 | import 'package:reddit_video_downloader/helper/ShowAds.dart';
7 | import 'package:reddit_video_downloader/screens/ImagesDetails.dart';
8 | import 'package:reddit_video_downloader/screens/VideoPlayer.dart';
9 |
10 | Directory dir = Directory('/storage/emulated/0/DownloadIt/Facebook');
11 | Directory thumbDir = Directory('/storage/emulated/0/.downloadit/.thumbs');
12 |
13 | class FacebookGallery extends StatefulWidget {
14 | @override
15 | _FacebookGalleryState createState() => _FacebookGalleryState();
16 | }
17 |
18 | class _FacebookGalleryState extends State {
19 | List _isImage = [];
20 | ShowAds _showAds = ShowAds(adUnitID: AdsHelper.nativeAds);
21 |
22 | void _checkType() {
23 | for (var item in dir.listSync()) {
24 | if (item.toString().endsWith(".jpg'")) {
25 | _isImage.add(true);
26 | } else {
27 | _isImage.add(false);
28 | }
29 | }
30 | }
31 |
32 | @override
33 | void initState() {
34 | super.initState();
35 | if (dir.existsSync()) {
36 | _checkType();
37 | }
38 | }
39 |
40 | @override
41 | Widget build(BuildContext context) {
42 | if (!dir.existsSync()) {
43 | return Center(
44 | child: Text(
45 | 'Sorry, No Downloads Found!',
46 | style: TextStyle(fontSize: 18.0),
47 | ),
48 | );
49 | } else {
50 | var fileList = dir.listSync();
51 | if (fileList.length > 0) {
52 | return Container(
53 | padding: EdgeInsets.only(bottom: 150.0),
54 | margin: EdgeInsets.only(left: 8.0, right: 8.0),
55 | child: GridView.builder(
56 | itemCount: fileList.length,
57 | itemBuilder: (context, index) {
58 | File file = fileList[index];
59 | if (_isImage[index] == false) {
60 | String thumb = fileList[index].toString().replaceAll('File: \'/storage/emulated/0/DownloadIt/Facebook/', '');
61 | thumb = thumb.substring(0, thumb.length - 4) + 'jpg';
62 | var path = thumbDir.path + '/' + thumb;
63 | file = File(path);
64 | }
65 | return Column(
66 | children: [
67 | _isImage[index]
68 | ? GestureDetector(
69 | onTap: ()
70 | {
71 | _showAds.showInerstitial();
72 | Navigator.push(
73 | context,
74 | MaterialPageRoute(
75 | builder: (context) => Images(
76 | file: file,
77 | ),
78 | ),
79 | );
80 | },
81 | child: Container(
82 | height: screenWidthSize(120, context),
83 | width: screenWidthSize(120, context),
84 | decoration: BoxDecoration(
85 | shape: BoxShape.rectangle,
86 | color: Theme.of(context).primaryColor,
87 | ),
88 | child: Image.file(
89 | file,
90 | fit: BoxFit.fitWidth,
91 | ),
92 | ),
93 | )
94 | : Stack(
95 | children: [
96 | Container(
97 | height: screenWidthSize(120, context),
98 | width: screenWidthSize(120, context),
99 | decoration: BoxDecoration(
100 | shape: BoxShape.rectangle,
101 | color: Theme.of(context).primaryColor,
102 | ),
103 | child: Image.file(
104 | file,
105 | fit: BoxFit.fitWidth,
106 | ),
107 | ),
108 | Align(
109 | alignment: Alignment.center,
110 | child: Padding(
111 | padding: EdgeInsets.all(4.0),
112 | child: Play(file:fileList[index]),
113 | ),
114 | ),
115 | ],
116 | )
117 | ],
118 | );
119 | },
120 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
121 | crossAxisCount: 3,
122 | mainAxisSpacing: 1.0,
123 | crossAxisSpacing: 10.0,
124 | childAspectRatio: 0.9,
125 | ),
126 | ),
127 | );
128 | } else {
129 | return Scaffold(
130 | body: Center(
131 | child: new Container(
132 | padding: EdgeInsets.only(bottom: 60.0),
133 | child: Text(
134 | 'Sorry, No Downloads Found!',
135 | style: TextStyle(fontSize: 18.0),
136 | )),
137 | ),
138 | );
139 | }
140 | }
141 | }
142 | }
143 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/galleryScreen.dart:
--------------------------------------------------------------------------------
1 | import 'package:firebase_admob/firebase_admob.dart';
2 | import 'package:flutter/material.dart';
3 | import 'package:permission_handler/permission_handler.dart';
4 | import 'package:reddit_video_downloader/constants/appConstant.dart';
5 | import 'package:reddit_video_downloader/helper/AdsHelper.dart';
6 | import 'package:reddit_video_downloader/screens/facebookDownload/galleryScreen.dart';
7 | import 'package:reddit_video_downloader/screens/galleryScreenReddit.dart';
8 | import 'package:reddit_video_downloader/screens/instagramDownload/galleryScreen.dart';
9 | import 'package:reddit_video_downloader/screens/tiktokDownload/galleryScreen.dart';
10 | import 'package:reddit_video_downloader/screens/whatsappDownload/galleryScreen.dart';
11 |
12 | const String testDevice = 'MobileId';
13 | class GalleryScreen extends StatefulWidget {
14 | @override
15 | _GalleryScreenState createState() => _GalleryScreenState();
16 | }
17 |
18 | class _GalleryScreenState extends State with TickerProviderStateMixin {
19 | TabController _galleryTabController;
20 | static const MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo(
21 | testDevices: testDevice != null ? [testDevice] : null,
22 | nonPersonalizedAds: true,
23 | keywords: ['video', 'download'],
24 | );
25 | BannerAd _bannerAd;
26 |
27 |
28 | BannerAd createBannerAd() {
29 | return BannerAd(
30 | adUnitId:AdsHelper.bannerAds,
31 | //Change BannerAd adUnitId with Admob ID
32 | size: AdSize.smartBanner,
33 | targetingInfo: targetingInfo,
34 | listener: (MobileAdEvent event) {
35 | print("BannerAd $event");
36 | });
37 | }
38 | @override
39 | void initState() {
40 | super.initState();
41 | _bannerAd = createBannerAd()
42 | ..load().then((loaded) {
43 | if (loaded && this.mounted) {
44 | _bannerAd..show();
45 | }
46 |
47 | });
48 | _galleryTabController = TabController(length: 5, vsync: this);
49 | }
50 |
51 | @override
52 | void dispose() {
53 | super.dispose();
54 | _bannerAd.dispose();
55 | _galleryTabController.dispose();
56 | }
57 |
58 | @override
59 | Widget build(BuildContext context) {
60 | return Scaffold(
61 | appBar: screenAppBar('App Gallery'),
62 | body: SingleChildScrollView(
63 | physics: BouncingScrollPhysics(),
64 | padding: EdgeInsets.symmetric(horizontal: 5.0),
65 | child: Column(
66 | children: [
67 | SizedBox(
68 | height: 10,
69 | ),
70 | Container(
71 | child: TabBar(
72 | controller: _galleryTabController,
73 | indicatorColor: Colors.blue,
74 | labelColor: Colors.blue,
75 | unselectedLabelColor: Colors.blueGrey,
76 | isScrollable: true,
77 | tabs: [
78 | Container(
79 | child: Padding(
80 | padding: EdgeInsets.symmetric(vertical: 10.0),
81 | child: Text('WhatsApp'),
82 | ),
83 | ),
84 | Container(
85 | child: Padding(
86 | padding: EdgeInsets.symmetric(vertical: 10.0),
87 | child: Text('Reddit'),
88 | ),
89 | ),
90 | Container(
91 | child: Padding(
92 | padding: EdgeInsets.symmetric(vertical: 10.0),
93 | child: Text('Instagram'),
94 | ),
95 | ),
96 | Container(
97 | child: Padding(
98 | padding: EdgeInsets.symmetric(vertical: 10.0),
99 | child: Text('Facebook'),
100 | ),
101 | ),
102 | Container(
103 | child: Padding(
104 | padding: EdgeInsets.symmetric(vertical: 10.0),
105 | child: Text('TikTok'),
106 | ),
107 | ),
108 | // Tab(
109 | // icon: Icon(Icons.photo_library),
110 | // text: 'IMAGES',
111 | // ),
112 | ],
113 | ),
114 | ),
115 | SizedBox(
116 | height: 20,
117 | ),
118 | Container(
119 | height: screenHeightSize(650, context),
120 | child: TabBarView(
121 | controller: _galleryTabController,
122 | children: [
123 | WhatsappGallery(),
124 | RedditGallery(),
125 | InstagramGallery(),
126 | FacebookGallery(),
127 | TiktokGallery(),
128 | ],
129 | ),
130 | ),
131 | ],
132 | ),
133 | ),
134 | );
135 | }
136 | }
137 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/galleryScreenReddit.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:firebase_admob/firebase_admob.dart';
3 | import 'package:flutter/material.dart';
4 | import 'package:path_provider/path_provider.dart';
5 | import 'package:reddit_video_downloader/WidgetHelper/Playbtn.dart';
6 | import 'package:reddit_video_downloader/constants/appConstant.dart';
7 | import 'package:reddit_video_downloader/helper/AdsHelper.dart';
8 | import 'package:reddit_video_downloader/helper/VideoCard.dart';
9 | import 'package:reddit_video_downloader/screens/Thumbnails.dart';
10 | import 'package:share_extend/share_extend.dart';
11 |
12 |
13 | import 'VideoPlayer.dart';
14 |
15 |
16 | Directory dir = Directory('/storage/emulated/0/DownloadIT Now/');
17 | //Directory thumbDir = Directory('/storage/emulated/0/.DownloadIt/.thumbs');
18 |
19 | class RedditGallery extends StatefulWidget {
20 | @override
21 | _RedditGalleryState createState() => _RedditGalleryState();
22 | }
23 |
24 | class _RedditGalleryState extends State {
25 | // List _isImage = [];
26 |
27 |
28 | @override
29 | void initState() {
30 | super.initState();
31 | //Change appId With Admob Id
32 |
33 |
34 | }
35 |
36 |
37 |
38 | @override
39 | Widget build(BuildContext context) {
40 | if (!dir.existsSync()) {
41 | return Center(
42 | child: new Container(
43 | padding: EdgeInsets.only(bottom: 10.0),
44 | child: Text(
45 | 'Sorry, No Downloads Found!',
46 | style: TextStyle(fontSize: 18.0),
47 | )),
48 | );
49 |
50 | } else {
51 | var fileList = dir.listSync();
52 | if (fileList.length > 0) {
53 | return Scaffold(
54 | // appBar: screenAppBar('Gallery'),
55 | body: Container(
56 | padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top,bottom: 66.0),
57 | margin: EdgeInsets.only(left: 8.0, right: 8.0),
58 | child: GridView.builder(
59 | itemCount: fileList.length,
60 | itemBuilder: (context, index) {
61 | File file = fileList[index];
62 | return VideoItem(file: file,);
63 | },
64 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
65 | crossAxisCount: 3,
66 | mainAxisSpacing: 1.0,
67 | crossAxisSpacing: 10.0,
68 | childAspectRatio: 0.9,
69 | ),
70 | ),
71 | ),
72 | );
73 | } else {
74 | return Center(
75 | child: new Container(
76 | padding: EdgeInsets.only(bottom: 60.0),
77 | child: Text(
78 | 'Sorry, No Downloads Found!',
79 | style: TextStyle(fontSize: 18.0),
80 | )),
81 | );
82 | }
83 | }
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/home/download.dart:
--------------------------------------------------------------------------------
1 | import 'package:connectivity/connectivity.dart';
2 | import 'package:firebase_admob/firebase_admob.dart';
3 | import 'package:flutter/cupertino.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:flutter/services.dart';
6 | import 'package:flutter/widgets.dart';
7 | import 'package:flutter_native_admob/flutter_native_admob.dart';
8 | import 'package:flutter_native_admob/native_admob_controller.dart';
9 | import 'package:percent_indicator/circular_percent_indicator.dart';
10 | import 'package:percent_indicator/linear_percent_indicator.dart';
11 | import 'package:reddit_video_downloader/actions/actions.dart';
12 | import 'package:reddit_video_downloader/constants/appConstant.dart';
13 | import 'package:reddit_video_downloader/helper/AdsHelper.dart';
14 | import 'package:reddit_video_downloader/helper/ShowAds.dart';
15 | import 'package:redux/redux.dart';
16 | import 'package:flutter_redux/flutter_redux.dart';
17 | import 'package:reddit_video_downloader/models/app_state.dart';
18 | import 'package:redux_epics/redux_epics.dart';
19 |
20 | const String testDevice = 'MobileId';
21 |
22 | class Download extends StatefulWidget {
23 | static const platform = const MethodChannel('app.channel.shared.data');
24 | TextEditingController urlController = TextEditingController();
25 |
26 |
27 |
28 | @override
29 | _DownloadState createState() => _DownloadState();
30 | }
31 |
32 | class _DownloadState extends State {
33 | ShowAds _showAds = ShowAds(adUnitID: AdsHelper.nativeAds);
34 | var _fbScaffoldKey = GlobalKey();
35 | //final _nativeAdmob = NativeAdmob();
36 | // final _nativeAdController = NativeAdmobController();
37 | //
38 | // static const _adUnitID = AdsHelper.nativeAds;
39 | // static const MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo(
40 | // testDevices: testDevice != null ? [testDevice] : null,
41 | // nonPersonalizedAds: true,
42 | // keywords: ['video', 'download'],
43 | // );
44 | // InterstitialAd _interstitialAd;
45 | // InterstitialAd createInterstitialAd() {
46 | // return InterstitialAd(
47 | // adUnitId: AdsHelper.interstitialAds,
48 | // //Change Interstitial AdUnitId with Admob ID
49 | // targetingInfo: targetingInfo,
50 | // listener: (MobileAdEvent event) {
51 | // print("IntersttialAd $event");
52 | // });
53 | // }
54 |
55 | @override
56 | void initState() {
57 | super.initState();
58 | }
59 |
60 |
61 |
62 | @override
63 | void dispose() {
64 | // ShowAds..dispose();
65 | super.dispose();
66 | }
67 |
68 | @override
69 | Widget build(BuildContext context) {
70 | void startDownload() {
71 | StoreProvider.of(context).dispatch(
72 | new StartDownloadAction(widget.urlController.text, context));
73 | widget.urlController.clear();
74 | }
75 |
76 | return Scaffold(
77 | key: _fbScaffoldKey,
78 | appBar: screenAppBar("Reddit Downloader"),
79 | body: SingleChildScrollView(
80 | physics: BouncingScrollPhysics(),
81 | child: Container(
82 | padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
83 | child: StoreConnector(
84 | converter: (store) => store.state.download.isDownloading,
85 | builder: (context, isDownloading) {
86 | if (!isDownloading) {
87 | return Column(children: [
88 | SizedBox(height: 60,),
89 | Padding(
90 | padding: EdgeInsets.symmetric(
91 | horizontal: 15.0, vertical: 10),
92 | child: TextField(
93 | keyboardType: TextInputType.text,
94 | controller: widget.urlController,
95 | maxLines: 1,
96 | textInputAction: TextInputAction.done,
97 | decoration: InputDecoration(
98 | border: OutlineInputBorder(
99 | borderRadius: BorderRadius.circular(30.0)),
100 | hintText: 'https://www.reddit.com/...'),
101 | onChanged: (value) {
102 | //getButton(value);
103 | },
104 | ),
105 | ),
106 | SizedBox(height: 5),
107 | Row(
108 | mainAxisAlignment: MainAxisAlignment.spaceEvenly,
109 | children: [
110 | MyButton(
111 | text: 'PASTE',
112 | onPressed: () async {
113 | Map result = await SystemChannels
114 | .platform
115 | .invokeMethod('Clipboard.getData');
116 | WidgetsBinding.instance.addPostFrameCallback(
117 | (_) => widget.urlController.text =
118 | result['text'].toString(),
119 | );
120 | },
121 | ),
122 | MyButton(
123 | text: 'Download',
124 | onPressed: () async {
125 | var connectivityResult =
126 | await Connectivity().checkConnectivity();
127 | if (connectivityResult ==
128 | ConnectivityResult.none) {
129 | _fbScaffoldKey.currentState.showSnackBar(
130 | mySnackBar(context, 'No Internet'));
131 | return;
132 | }
133 | _showAds.showInerstitial();
134 | startDownload();
135 | },
136 | ),
137 | ],
138 | ),
139 | Padding(
140 | padding: const EdgeInsets.all(18.0),
141 | child: Container(
142 | //You Can Set Container Height
143 | height: MediaQuery.of(context).size.height*0.3,
144 | child: _showAds.showNative(),
145 | ),
146 | )
147 | ]);
148 | } else {
149 | return Downloading();
150 | }
151 | })),
152 | ),
153 | );
154 | }
155 | }
156 |
157 | class Downloading extends StatefulWidget {
158 | @override
159 | _DownloadingState createState() => _DownloadingState();
160 | }
161 |
162 | class _DownloadingState extends State {
163 | @override
164 | void initState() {
165 | // TODO: implement initState
166 | super.initState();
167 | }
168 |
169 | @override
170 | Widget build(BuildContext context) {
171 | return StoreConnector(
172 | converter: (Store store) => store.state.download.status,
173 | builder: (context, String status) {
174 | double percent = 0.0;
175 | percent = DateTime.now().second / 100;
176 | print(percent);
177 | if (status == 'Success') percent = 1.0;
178 |
179 | return Center(
180 | child: Column(
181 | children: [
182 | SizedBox(
183 | height: 15,
184 | ),
185 | new CircularPercentIndicator(
186 | radius: 120.0,
187 | lineWidth: 13.0,
188 | //animation: true,
189 | percent: status == 'Success' ? 1.0 : percent,
190 | center: new Text(
191 | "${(percent * 100).toStringAsFixed(2)} %",
192 | style: new TextStyle(
193 | fontWeight: FontWeight.bold, fontSize: 20.0),
194 | ),
195 | footer: new Text(
196 | "In Progress...",
197 | style: new TextStyle(
198 | fontWeight: FontWeight.bold, fontSize: 17.0),
199 | ),
200 | circularStrokeCap: CircularStrokeCap.round,
201 | progressColor: Colors.purple,
202 | ),
203 | SizedBox(
204 | height: 15,
205 | ),
206 | Padding(
207 | padding: const EdgeInsets.all(18.0),
208 | child: status == 'Success'
209 | ? Text(
210 | 'Done',
211 | textAlign: TextAlign.center,
212 | )
213 | : Text(
214 | status,
215 | textAlign: TextAlign.center,
216 | ),
217 | ),
218 | ],
219 | ),
220 | );
221 | },
222 | );
223 | }
224 | }
225 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/home/home.dart:
--------------------------------------------------------------------------------
1 | import 'dart:ui';
2 |
3 | import 'package:backdrop/backdrop.dart';
4 | import 'package:bottom_navy_bar/bottom_navy_bar.dart';
5 | import 'package:cached_network_image/cached_network_image.dart';
6 | import 'package:flutter/material.dart';
7 | import 'package:flutter/services.dart';
8 | import 'package:permission_handler/permission_handler.dart';
9 | import 'package:reddit_video_downloader/WidgetHelper/ContainerLotties.dart';
10 | import 'package:reddit_video_downloader/constants/appTheme.dart';
11 | import 'package:reddit_video_downloader/helper/app_animations.dart';
12 | import 'package:reddit_video_downloader/helper/theme_changer.dart';
13 | import 'package:reddit_video_downloader/screens/About.dart';
14 | import 'package:reddit_video_downloader/screens/facebookDownload/facebookDownloadScreen.dart';
15 | import 'package:reddit_video_downloader/screens/galleryScreen.dart';
16 | import 'package:reddit_video_downloader/screens/galleryScreenReddit.dart';
17 | import 'package:reddit_video_downloader/screens/home/download.dart';
18 | import 'package:reddit_video_downloader/screens/instagramDownload/instagramDownloadScreen.dart';
19 | import 'package:reddit_video_downloader/screens/tiktokDownload/tiktokDownloadScreen.dart';
20 | import 'package:reddit_video_downloader/screens/whatsappDownload/whatsappDownloadScreen.dart';
21 | import 'package:share/share.dart';
22 | import 'package:url_launcher/url_launcher.dart';
23 | bool mode = false;
24 | class Home extends StatefulWidget {
25 | @override
26 | _HomeState createState() => _HomeState();
27 | }
28 |
29 | class _HomeState extends State {
30 | _checkPermission() async
31 | {
32 | PermissionStatus permission = await PermissionHandler()
33 | .checkPermissionStatus(PermissionGroup.storage);
34 |
35 | if (permission != PermissionStatus.granted) {
36 | Map permissions =
37 | await PermissionHandler()
38 | .requestPermissions([PermissionGroup.storage]);
39 | debugPrint(permissions.toString());
40 | var status = permissions[PermissionGroup.storage];
41 |
42 | if (status != PermissionStatus.granted) {
43 | Navigator.pop(context);
44 | SystemNavigator.pop();
45 | debugPrint('access denied');
46 |
47 | }
48 | }
49 | }
50 | @override
51 | void initState() {
52 | // TODO: implement initState
53 | super.initState();
54 | _checkPermission();
55 | }
56 | Future _lauchUrl(String url) async {
57 | if (await canLaunch(url)) {
58 | await launch(
59 | url,
60 | enableJavaScript: true,
61 | forceWebView: false,
62 | forceSafariVC: false,
63 | );
64 | } else {
65 | print('Can\'t Lauch url');
66 | }
67 | }
68 | @override
69 | Widget build(BuildContext context) {
70 | return BackdropScaffold(
71 | appBar: BackdropAppBar(
72 | title: Text("DownloadIt"),
73 |
74 | ),
75 | // stickyFrontLayer: true,
76 | animationCurve: Curves.linear,
77 | headerHeight: MediaQuery.of(context).size.height * 0.2,
78 | backLayer: BackdropNavigationBackLayer(items: [
79 | SingleChildScrollView(
80 |
81 | scrollDirection: Axis.vertical,
82 | padding: const EdgeInsets.only(bottom: 50.0),
83 | child: Column(
84 | crossAxisAlignment: CrossAxisAlignment.center,
85 | mainAxisAlignment: MainAxisAlignment.spaceAround,
86 | children: [
87 | Container(
88 | padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
89 | child: Image.asset(
90 | "assets/images/rvd.png",
91 | scale: 2.0,
92 | ),
93 | ),
94 | SizedBox(height: 10,),
95 | Container(
96 | padding: EdgeInsets.symmetric(horizontal: 15,vertical: 10),
97 | alignment: Alignment.center,
98 | child: Text(' if you loved this free video downloader please share it with your friends and rate us on Playstore. ',style:
99 | TextStyle( fontFamily: 'WorkSans',fontSize: 15),textAlign: TextAlign.center,),
100 | ),
101 | SizedBox(height: 10,),
102 | Card(
103 | child: Column(
104 | children: [
105 | GestureDetector(child: ListTile(leading: Icon(Icons.share),title: Text('Share the App',style: TextStyle( fontFamily: 'WorkSans'),),),
106 | onTap: (){
107 | Share.share('Download Stories,Videos,Status and much more in One Click using Reddit Video Downloader App.\n\n Checkout the Link below also share it with your Friends.\n https://play.google.com/store/apps/details?id=com.downloading.social_media');
108 |
109 | },),
110 | GestureDetector(child: ListTile(leading: Icon(Icons.star),title: Text('Rate us',style: TextStyle( fontFamily: 'WorkSans'),),),
111 | onTap: (){
112 | _lauchUrl('https://play.google.com/store/apps/details?id=com.downloading.social_media');
113 | },),
114 | GestureDetector(child: ListTile(leading: Icon(Icons.more),title: Text('More App',style: TextStyle( fontFamily: 'WorkSans'),),),
115 | onTap: (){
116 | _lauchUrl('https://play.google.com/store/apps/developer?id=HD+Video+downloader+-+Video+to+mp3+converter');
117 | },),
118 | ],
119 | ),
120 | ),
121 | SizedBox(height: 10,),
122 |
123 | ListTile(
124 | title: new Text(
125 | "Exit",
126 | style: new TextStyle(
127 | fontFamily: AppTheme.fontName,
128 | fontWeight: FontWeight.w600,
129 | fontSize: 16,
130 | ),
131 | textAlign: TextAlign.left,
132 | ),
133 | trailing: new Icon(
134 | Icons.power_settings_new,
135 | color: Colors.red,
136 | ),
137 | onTap: () {
138 | SystemNavigator.pop();
139 | },
140 | ),
141 | ],
142 | ),
143 | )
144 | ]),
145 | frontLayerBorderRadius: BorderRadius.only(
146 | topLeft: Radius.circular(20.0), topRight: Radius.circular(20.0)),
147 | frontLayer: Scaffold(
148 | backgroundColor: Colors.black12.withOpacity(0.1),
149 | body : Padding(
150 | padding: EdgeInsets.only(top: MediaQuery.of(context).padding.top),
151 | child: CustomScrollView(
152 | slivers: [
153 | SliverPadding(
154 | padding: const EdgeInsets.all(26.0),
155 | sliver: SliverGrid.count(
156 | crossAxisCount: 2,
157 | mainAxisSpacing: 10,
158 | crossAxisSpacing: 10,
159 | children: [
160 | GestureDetector(onTap: (){Navigator.push(context, MaterialPageRoute(builder: (BuildContext context)=>FacebookDownload()));},
161 | child: ContainerLotties(header:'Facebook' ,animationPath: AppAnimations.fb,)),
162 | GestureDetector(onTap: (){Navigator.push(context, MaterialPageRoute(builder: (BuildContext context)=>InstagramDownload()));},
163 | child: ContainerLotties(header:'Instagram' ,animationPath: AppAnimations.insta,)),
164 | GestureDetector(onTap: (){Navigator.push(context, MaterialPageRoute(builder: (BuildContext context)=>WhatsappDownload()));},
165 | child: ContainerLotties(header:'Whatsapp' ,animationPath: AppAnimations.whatsapp,)),
166 | GestureDetector(onTap: (){Navigator.push(context, MaterialPageRoute(builder: (BuildContext context)=>Download()));},
167 | child: ContainerLotties(header:'Reddit' ,animationPath: AppAnimations.reddit,)),
168 | GestureDetector(onTap: (){Navigator.push(context, MaterialPageRoute(builder: (BuildContext context)=>TiktokDownload()));},
169 | child: ContainerLotties(header:'TikTok' ,animationPath: AppAnimations.tiktok,)),
170 | GestureDetector(onTap: (){Navigator.push(context, MaterialPageRoute(builder: (BuildContext context)=>GalleryScreen()));},
171 | child: ContainerLotties(header:'Go to your Downloads' ,animationPath: AppAnimations.download,)),
172 | ],
173 | ),
174 | ),
175 | ],
176 | ),
177 | )) ,
178 | );
179 |
180 |
181 |
182 |
183 |
184 |
185 | }
186 | }
187 |
188 | class RedditResponse {
189 | final String videoUrl;
190 |
191 | RedditResponse({this.videoUrl});
192 | }
193 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/instagramDownload/galleryScreen.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:flutter/material.dart';
3 | import 'package:reddit_video_downloader/WidgetHelper/Playbtn.dart';
4 | import 'package:reddit_video_downloader/constants/appConstant.dart';
5 | import 'package:reddit_video_downloader/helper/AdsHelper.dart';
6 | import 'package:reddit_video_downloader/helper/ShowAds.dart';
7 |
8 | import '../ImagesDetails.dart';
9 | import '../VideoPlayer.dart';
10 |
11 | Directory dir = Directory('/storage/emulated/0/DownloadIt/Instagram');
12 | Directory thumbDir = Directory('/storage/emulated/0/.downloadit/.thumbs');
13 |
14 | class InstagramGallery extends StatefulWidget {
15 | @override
16 | _InstagramGalleryState createState() => _InstagramGalleryState();
17 | }
18 |
19 | class _InstagramGalleryState extends State {
20 | List _isImage = [];
21 | ShowAds _showAds = ShowAds(adUnitID: AdsHelper.nativeAds);
22 |
23 | void _checkType() {
24 | for (var item in dir.listSync()) {
25 | if (item.toString().endsWith(".jpg'")) {
26 | _isImage.add(true);
27 | } else {
28 | _isImage.add(false);
29 | }
30 | }
31 | }
32 |
33 | @override
34 | void initState() {
35 | super.initState();
36 | if (dir.existsSync()) {
37 | _checkType();
38 | }
39 | }
40 |
41 | @override
42 | Widget build(BuildContext context) {
43 | if (!dir.existsSync()) {
44 | return Center(
45 | child: Text(
46 | 'Sorry, No Downloads Found!',
47 | style: TextStyle(fontSize: 18.0),
48 | ),
49 | );
50 | } else {
51 | var fileList = dir.listSync();
52 | if (fileList.length > 0) {
53 | return Container(
54 | padding: EdgeInsets.only(bottom: 150.0),
55 | margin: EdgeInsets.only(left: 8.0, right: 8.0),
56 | child: GridView.builder(
57 | itemCount: fileList.length,
58 | itemBuilder: (context, index) {
59 | File file = fileList[index];
60 | if (_isImage[index] == false) {
61 | String thumb = fileList[index].toString().replaceAll(
62 | 'File: \'/storage/emulated/0/DownloadIt/Instagram/', '');
63 | thumb = thumb.substring(0, thumb.length - 4) + 'jpg';
64 | var path = thumbDir.path + '/' + thumb;
65 | file = File(path);
66 | }
67 | return Column(
68 | children: [
69 | _isImage[index]
70 | ? GestureDetector(
71 | onTap: () {
72 | Navigator.push(
73 | context,
74 | MaterialPageRoute(
75 | builder: (context) => Images(
76 | file: fileList[index],
77 | ),
78 | ),
79 | );
80 | },
81 | child: Container(
82 | height: screenWidthSize(120, context),
83 | width: screenWidthSize(120, context),
84 | decoration: BoxDecoration(
85 | shape: BoxShape.rectangle,
86 | color: Theme.of(context).primaryColor,
87 | ),
88 | child: Image.file(
89 | file,
90 | fit: BoxFit.fitWidth,
91 | ),
92 | ),
93 | )
94 | : Stack(
95 | children: [
96 | Container(
97 | height: screenWidthSize(120, context),
98 | width: screenWidthSize(120, context),
99 | decoration: BoxDecoration(
100 | shape: BoxShape.rectangle,
101 | color: Theme.of(context).primaryColor,
102 | ),
103 | child: Image.file(
104 | file,
105 | fit: BoxFit.fitWidth,
106 | ),
107 | ),
108 | Align(
109 | alignment: Alignment.center,
110 | child: Padding(
111 | padding: EdgeInsets.all(4.0),
112 | child: Play(file:fileList[index]),
113 | ),
114 | ),
115 | ],
116 | )
117 | ],
118 | );
119 | },
120 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
121 | crossAxisCount: 3,
122 | mainAxisSpacing: 1.0,
123 | crossAxisSpacing: 10.0,
124 | childAspectRatio: 0.9,
125 | ),
126 | ),
127 | );
128 | } else {
129 | return Scaffold(
130 | body: Center(
131 | child: new Container(
132 | padding: EdgeInsets.only(bottom: 60.0),
133 | child: Text(
134 | 'Sorry, No Downloads Found!',
135 | style: TextStyle(fontSize: 18.0),
136 | )),
137 | ),
138 | );
139 | }
140 | }
141 | }
142 | }
143 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/tiktokDownload/galleryScreen.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:flutter/material.dart';
3 | import 'package:reddit_video_downloader/WidgetHelper/Playbtn.dart';
4 | import 'package:reddit_video_downloader/constants/appConstant.dart';
5 | import 'package:reddit_video_downloader/helper/AdsHelper.dart';
6 | import 'package:reddit_video_downloader/helper/ShowAds.dart';
7 | import 'package:reddit_video_downloader/screens/ImagesDetails.dart';
8 | import 'package:reddit_video_downloader/screens/VideoPlayer.dart';
9 |
10 | Directory dir = Directory('/storage/emulated/0/DownloadIt/Tiktok');
11 | Directory thumbDir = Directory('/storage/emulated/0/.downloadit/.thumbs');
12 |
13 | class TiktokGallery extends StatefulWidget {
14 | @override
15 | _TiktokGalleryState createState() => _TiktokGalleryState();
16 | }
17 |
18 | class _TiktokGalleryState extends State {
19 | List _isImage = [];
20 | ShowAds _showAds = ShowAds(adUnitID: AdsHelper.nativeAds);
21 |
22 | void _checkType() {
23 | for (var item in dir.listSync()) {
24 | if (item.toString().endsWith(".jpg'")) {
25 | _isImage.add(true);
26 | } else {
27 | _isImage.add(false);
28 | }
29 | }
30 | }
31 |
32 | @override
33 | void initState() {
34 | super.initState();
35 | if (dir.existsSync()) {
36 | _checkType();
37 | }
38 | }
39 |
40 | @override
41 | Widget build(BuildContext context) {
42 | if (!dir.existsSync()) {
43 | return Center(
44 | child: Text(
45 | 'Sorry, No Downloads Found!',
46 | style: TextStyle(fontSize: 18.0),
47 | ),
48 | );
49 | } else {
50 | var fileList = dir.listSync();
51 | if (fileList.length > 0) {
52 | return Container(
53 | padding: EdgeInsets.only(bottom: 150.0),
54 | margin: EdgeInsets.only(left: 8.0, right: 8.0),
55 | child: GridView.builder(
56 | itemCount: fileList.length,
57 | itemBuilder: (context, index) {
58 | File file = fileList[index];
59 | if (_isImage[index] == false) {
60 | String thumb = fileList[index].toString().replaceAll('File: \'/storage/emulated/0/DownloadIt/Tiktok/', '');
61 | thumb = thumb.substring(0, thumb.length - 4) + 'jpg';
62 | var path = thumbDir.path + '/' + thumb;
63 | file = File(path);
64 | }
65 | return Column(
66 | children: [
67 | _isImage[index]
68 | ? GestureDetector(
69 | onTap: ()
70 | {
71 | Navigator.push(
72 | context,
73 | MaterialPageRoute(
74 | builder: (context) => Images(
75 | file: file,
76 | ),
77 | ),
78 | );
79 | },
80 | child: Container(
81 | height: screenWidthSize(120, context),
82 | width: screenWidthSize(120, context),
83 | decoration: BoxDecoration(
84 | shape: BoxShape.rectangle,
85 | color: Theme.of(context).primaryColor,
86 | ),
87 | child: Image.file(
88 | file,
89 | fit: BoxFit.fitWidth,
90 | ),
91 | ),
92 | )
93 | : Stack(
94 | children: [
95 | Container(
96 | height: screenWidthSize(120, context),
97 | width: screenWidthSize(120, context),
98 | decoration: BoxDecoration(
99 | shape: BoxShape.rectangle,
100 | color: Theme.of(context).primaryColor,
101 | ),
102 | child: Image.file(
103 | file,
104 | fit: BoxFit.fitWidth,
105 | ),
106 | ),
107 | Align(
108 | alignment: Alignment.center,
109 | child: Padding(
110 | padding: EdgeInsets.all(4.0),
111 | child: Play(file: fileList[index]),
112 | ),
113 | ),
114 | ],
115 | )
116 | ],
117 | );
118 | },
119 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
120 | crossAxisCount: 3,
121 | mainAxisSpacing: 1.0,
122 | crossAxisSpacing: 10.0,
123 | childAspectRatio: 0.9,
124 | ),
125 | ),
126 | );
127 | } else {
128 | return Scaffold(
129 | body: Center(
130 | child: new Container(
131 | padding: EdgeInsets.only(bottom: 60.0),
132 | child: Text(
133 | 'Sorry, No Downloads Found!',
134 | style: TextStyle(fontSize: 18.0),
135 | )),
136 | ),
137 | );
138 | }
139 | }
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/tiktokDownload/tiktokData.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 | import 'dart:io';
3 | import 'package:html/parser.dart';
4 | import 'package:http/http.dart';
5 |
6 | class TiktokData {
7 | static TiktokProfile _profileParsed = TiktokProfile();
8 | static TiktokMusic _musicParsed = TiktokMusic();
9 |
10 | static Future profileFromUrl(String profileUrl) async {
11 | String _temporaryData = '';
12 | int _startInx = 0, _endInx = 1;
13 | Client _client = Client();
14 | Response _response;
15 | Map _postData = Map();
16 | var _document, jsonData;
17 |
18 | String _patternStart = '"userInfo":';
19 | String _patternEnd = ',"userData"';
20 |
21 | try {
22 | _response = await _client.get('$profileUrl');
23 | _document = parse(_response.body);
24 | _document = _document.querySelectorAll('body');
25 | _temporaryData = _document[0].text;
26 |
27 | _temporaryData = _temporaryData.trim();
28 | _startInx = _temporaryData.indexOf(_patternStart) + _patternStart.length;
29 | _endInx = _temporaryData.indexOf(_patternEnd);
30 | _temporaryData = _temporaryData.substring(_startInx, _endInx);
31 | jsonData = json.decode(_temporaryData);
32 |
33 | _postData['profileUrl'] = 'https://www.tiktok.com/@' + jsonData['user']['uniqueId'].toString();
34 | _postData['profilePicUrl'] = jsonData['user']['avatarThumb'].toString();
35 | _postData['profilePicUrlHd'] = jsonData['user']['avatarMedium'].toString();
36 | _postData['userName'] = jsonData['user']['uniqueId'].toString();
37 | _postData['displayName'] = jsonData['user']['nickname'].toString();
38 | _postData['bio'] = jsonData['user']['signature'].toString().replaceAll('\n', ' ');
39 | _postData['videosCount'] = jsonData['stats']['videoCount'].toString();
40 | _postData['likesCount'] = jsonData['stats']['heartCount'].toString();
41 | _postData['followingsCount'] = jsonData['stats']['followingCount'].toString();
42 | _postData['followersCount'] = jsonData['stats']['followerCount'].toString();
43 | _postData['isPrivate'] = jsonData['user']['secret'].toString();
44 | _postData['isVerified'] = jsonData['user']['verified'].toString();
45 |
46 | _profileParsed = TiktokProfile.fromMap(_postData);
47 | } catch (error) {
48 | print('[InstaData][storyFromUrl]: $error');
49 | }
50 |
51 | return _profileParsed;
52 | }
53 |
54 | static Future postFromUrl(String postUrl) async {
55 | String _temporaryData = '';
56 | int _startInx = 0, _endInx = 1;
57 | Client _client = Client();
58 | Response _response;
59 | Map _postData = Map();
60 | var _document, jsonData;
61 |
62 | String _patternStart = ',"pageProps":';
63 | String _patternEnd = ',"pathname":';
64 |
65 | try {
66 | _response = await _client.get('$postUrl');
67 | _document = parse(_response.body);
68 | _document = _document.querySelectorAll('body');
69 | _temporaryData = _document[0].text;
70 | Directory dir = Directory('/storage/emulated/0/');
71 | File f = File(dir.path + 'ntt.txt');
72 | f.writeAsString(_temporaryData);
73 |
74 | String block = 'Govt. of India decided to block 59 apps, including TikTok';
75 | if (_temporaryData.contains(block)) {
76 | return null;
77 | }
78 |
79 | _temporaryData = _temporaryData.trim();
80 | _startInx = _temporaryData.indexOf(_patternStart) + _patternStart.length;
81 | _endInx = _temporaryData.indexOf(_patternEnd);
82 | _temporaryData = _temporaryData.substring(_startInx, _endInx);
83 | jsonData = json.decode(_temporaryData);
84 |
85 | _postData['videoUrl'] = postUrl;
86 | _postData['videoId'] = jsonData['videoData']['itemInfos']['id'].toString();
87 | _postData['thumbnailUrl'] = jsonData['videoData']['itemInfos']['covers'][0].toString();
88 | _postData['videoWatermarkUrl'] = jsonData['videoData']['itemInfos']['video']['urls'][0].toString();
89 | _postData['description'] = jsonData['videoData']['itemInfos']['text'].toString();
90 | _postData['dateTime'] = DateTime.fromMillisecondsSinceEpoch(int.parse(jsonData['videoData']['itemInfos']['createTime'].toString()) * 1000).toString();
91 |
92 | String noUseTags = jsonData['videoData']['authorInfos']['uniqueId'].toString() + ', ' + jsonData['videoData']['authorInfos']['nickName'].toString();
93 | noUseTags = noUseTags + ', TikTok, ティックトック, tik tok, tick tock, tic tok, tic toc, tictok, тик ток, ticktock,';
94 | _postData['hashtags'] = jsonData['metaParams']['keywords'].toString().replaceAll(noUseTags, '');
95 |
96 | _postData['likes'] = jsonData['videoData']['itemInfos']['diggCount'].toString();
97 | _postData['commentsCount'] = jsonData['videoData']['itemInfos']['commentCount'].toString();
98 | _postData['videoViewsCount'] = jsonData['videoData']['itemInfos']['playCount'].toString();
99 | _postData['sharesCount'] = jsonData['videoData']['itemInfos']['shareCount'].toString();
100 |
101 | var profileUrl = 'https://www.tiktok.com/@' + jsonData['videoData']['authorInfos']['uniqueId'].toString();
102 | _profileParsed = await profileFromUrl(profileUrl);
103 | _profileParsed.videoData = TiktokVideo.fromMap(_postData);
104 | var mname = jsonData['videoData']['musicInfos']['musicName'].toString().replaceAll(' ', '-');
105 | _profileParsed.videoData.videoMusic = await musicFromUrl('https://www.tiktok.com/music/' + mname + '-' + jsonData['videoData']['musicInfos']['musicId'].toString());
106 | } catch (error) {
107 | print('[InstaData][videoFromUrl]: $error');
108 | }
109 |
110 | return _profileParsed;
111 | }
112 |
113 | static Future musicFromUrl(String musicUrl) async {
114 | String _temporaryData = '';
115 | int _startInx = 0, _endInx = 1;
116 | Client _client = Client();
117 | Response _response;
118 | Map _postData = Map();
119 | var _document, jsonData;
120 |
121 | String _patternStart = '"pageProps":';
122 | String _patternEnd = ',"pathname"';
123 |
124 | try {
125 | _response = await _client.get('$musicUrl');
126 | _document = parse(_response.body);
127 | _document = _document.querySelectorAll('body');
128 |
129 | _temporaryData = _document[0].text;
130 | _temporaryData = _temporaryData.trim();
131 | _startInx = _temporaryData.indexOf(_patternStart) + _patternStart.length;
132 | _endInx = _temporaryData.indexOf(_patternEnd);
133 | _temporaryData = _temporaryData.substring(_startInx, _endInx);
134 | jsonData = json.decode(_temporaryData);
135 |
136 | jsonData = jsonData['musicData'];
137 | _postData['musicId'] = jsonData['musicId'].toString();
138 | _postData['musicTitle'] = jsonData['musicName'].toString();
139 | _postData['musicAuthor'] = jsonData['authorName'].toString();
140 | _postData['musicCover'] = jsonData['coversMedium'][0].toString();
141 | _postData['musicUrl'] = jsonData['playUrl']['UrlList'][0].toString();
142 | _postData['postCount'] = jsonData['posts'].toString();
143 |
144 | _musicParsed = TiktokMusic.fromMap(_postData);
145 | } catch (error) {
146 | print('[InstaData][musicFromUrl]: $error');
147 | }
148 |
149 | return _musicParsed;
150 | }
151 | }
152 |
153 | class TiktokProfile {
154 | String profileUrl = '';
155 | String profilePicUrl = '';
156 | String profilePicUrlHd = '';
157 | String userName = '';
158 | String displayName = '';
159 | String bio = '';
160 | int videosCount = 0;
161 | int likesCount = 0;
162 | int followingsCount = 0;
163 | int followersCount = 0;
164 | bool isPrivate = true;
165 | bool isVerified = false;
166 | TiktokVideo videoData;
167 |
168 | TiktokProfile({
169 | this.profileUrl,
170 | this.profilePicUrl,
171 | this.profilePicUrlHd,
172 | this.userName,
173 | this.displayName,
174 | this.bio,
175 | this.videosCount,
176 | this.likesCount,
177 | this.followingsCount,
178 | this.followersCount,
179 | this.isPrivate,
180 | this.isVerified,
181 | this.videoData,
182 | });
183 |
184 | factory TiktokProfile.fromMap(Map map) {
185 | return TiktokProfile(
186 | profileUrl: map['profileUrl'],
187 | profilePicUrl: map['profilePicUrl'],
188 | profilePicUrlHd: map['profilePicUrlHd'],
189 | userName: map['userName'],
190 | displayName: map['displayName'],
191 | bio: map['bio'] == null ? '' : map['bio'],
192 | videosCount: int.parse(map['videosCount'] == null ? '' : map['videosCount']),
193 | likesCount: int.parse(map['likesCount']),
194 | followingsCount: int.parse(map['followingsCount']),
195 | followersCount: int.parse(map['followersCount']),
196 | isPrivate: map['isPrivate'] == 'false' ? false : true,
197 | isVerified: map['isVerified'] == 'false' ? false : true,
198 | );
199 | }
200 | }
201 |
202 | class TiktokVideo {
203 | String videoUrl = '';
204 | String videoId = '';
205 | String thumbnailUrl;
206 | String videoWatermarkUrl = '';
207 | String videoNoWatermarkUrl = '';
208 | String description = '';
209 | String dateTime = '';
210 | List hashtags = [];
211 | int likes = 0;
212 | int commentsCount = 0;
213 | int videoViewsCount = 0;
214 | int sharesCount = 0;
215 | TiktokMusic videoMusic;
216 |
217 | TiktokVideo({
218 | this.videoUrl,
219 | this.videoId,
220 | this.thumbnailUrl,
221 | this.videoWatermarkUrl,
222 | this.videoNoWatermarkUrl,
223 | this.description,
224 | this.dateTime,
225 | this.hashtags,
226 | this.likes,
227 | this.commentsCount,
228 | this.videoViewsCount,
229 | this.sharesCount,
230 | this.videoMusic,
231 | });
232 |
233 | factory TiktokVideo.fromMap(Map map) {
234 | return TiktokVideo(
235 | videoUrl: map['videoUrl'] == null ? '' : map['videoUrl'],
236 | videoId: map['videoId'] == null ? '' : map['videoId'],
237 | thumbnailUrl: map['thumbnailUrl'] == null ? '' : map['thumbnailUrl'],
238 | videoNoWatermarkUrl: map['videoNoWatermarkUrl'] == null ? '' : map['videoNoWatermarkUrl'],
239 | videoWatermarkUrl: map['videoWatermarkUrl'],
240 | description: map['description'] == null ? '' : map['description'],
241 | dateTime: map['dateTime'] == null ? '' : map['dateTime'],
242 | hashtags: map['hashtags'].split(','),
243 | likes: int.parse(map['likes'] == null ? '0' : map['likes']),
244 | commentsCount: int.parse(map['commentsCount'] == null ? '0' : map['commentsCount']),
245 | videoViewsCount: int.parse(map['videoViewsCount'] == null ? '0' : map['videoViewsCount']),
246 | sharesCount: int.parse(map['sharesCount'] == null ? '0' : map['sharesCount']),
247 | );
248 | }
249 | }
250 |
251 | class TiktokMusic {
252 | String musicId = '';
253 | String musicTitle = '';
254 | String musicAuthor = '';
255 | String musicCover = '';
256 | String musicUrl = '';
257 | int postCount = 0;
258 |
259 | TiktokMusic({
260 | this.musicId,
261 | this.musicTitle,
262 | this.musicAuthor,
263 | this.musicCover,
264 | this.musicUrl,
265 | this.postCount,
266 | });
267 |
268 | factory TiktokMusic.fromMap(Map map) {
269 | return TiktokMusic(
270 | musicId: map['musicId'] == null ? '' : map['musicId'],
271 | musicTitle: map['musicTitle'] == null ? '' : map['musicTitle'],
272 | musicAuthor: map['musicAuthor'] == null ? '' : map['musicAuthor'],
273 | musicCover: map['musicCover'] == null ? '' : map['musicCover'],
274 | musicUrl: map['musicUrl'] == null ? '' : map['musicUrl'],
275 | postCount: int.parse(map['postCount'] == null ? '' : map['postCount']),
276 | );
277 | }
278 | }
279 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/whatsappDownload/galleryScreen.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:flutter/material.dart';
3 | import 'package:reddit_video_downloader/WidgetHelper/Playbtn.dart';
4 | import 'package:reddit_video_downloader/constants/appConstant.dart';
5 | import 'package:reddit_video_downloader/helper/AdsHelper.dart';
6 | import 'package:reddit_video_downloader/helper/ShowAds.dart';
7 | import 'package:reddit_video_downloader/screens/ImagesDetails.dart';
8 | import 'package:reddit_video_downloader/screens/VideoPlayer.dart';
9 |
10 |
11 | Directory dir = Directory('/storage/emulated/0/DownloadIt/WhatsApp');
12 | Directory thumbDir = Directory('/storage/emulated/0/.downloadit/.thumbs');
13 |
14 | class WhatsappGallery extends StatefulWidget {
15 |
16 | @override
17 | _WhatsappGalleryState createState() => _WhatsappGalleryState();
18 | }
19 |
20 | class _WhatsappGalleryState extends State {
21 | List _isImage = [];
22 | ShowAds _showAds = ShowAds(adUnitID: AdsHelper.nativeAds);
23 |
24 |
25 | void _checkType() {
26 | for (var item in dir.listSync()) {
27 | if (item.toString().endsWith(".jpg'")) {
28 | _isImage.add(true);
29 | } else {
30 | _isImage.add(false);
31 | }
32 | }
33 | }
34 |
35 | @override
36 | void initState() {
37 | super.initState();
38 | if (dir.existsSync()) {
39 | _checkType();
40 | }
41 | }
42 |
43 | @override
44 | Widget build(BuildContext context) {
45 | if (!dir.existsSync()) {
46 | return Center(
47 | child: Text(
48 | 'Sorry, No Downloads Found!',
49 | style: TextStyle(fontSize: 18.0),
50 | ),
51 | );
52 | } else {
53 | var fileList = dir.listSync();
54 | if (fileList.length > 0) {
55 | return Container(
56 | padding: EdgeInsets.only(bottom: 150.0),
57 | margin: EdgeInsets.only(left: 8.0, right: 8.0),
58 | child: GridView.builder(
59 | itemCount: fileList.length,
60 | itemBuilder: (context, index) {
61 | File file = fileList[index];
62 | if (_isImage[index] == false) {
63 | String thumb = fileList[index].toString().replaceAll('File: \'/storage/emulated/0/DownloadIt/WhatsApp/', '');
64 | thumb = thumb.substring(0, thumb.length - 4) + 'jpg';
65 | var path = thumbDir.path + '/' + thumb;
66 | file = File(path);
67 | }
68 | return Column(
69 | children: [
70 | _isImage[index]
71 | ? GestureDetector(
72 | onTap: ()
73 | {
74 | Navigator.push(
75 | context,
76 | MaterialPageRoute(
77 | builder: (context) => Images(
78 | file: file,
79 | ),
80 | ),
81 | );
82 | },
83 | child: Container(
84 | height: screenWidthSize(120, context),
85 | width: screenWidthSize(120, context),
86 | decoration: BoxDecoration(
87 | shape: BoxShape.rectangle,
88 | color: Theme.of(context).primaryColor,
89 | ),
90 | child: Image.file(
91 | file,
92 | fit: BoxFit.fitWidth,
93 | ),
94 | ),
95 | )
96 | : Stack(
97 | children: [
98 | Container(
99 | height: screenWidthSize(120, context),
100 | width: screenWidthSize(120, context),
101 | decoration: BoxDecoration(
102 | shape: BoxShape.rectangle,
103 | color: Theme.of(context).primaryColor,
104 | ),
105 | child: Image.file(
106 | file,
107 | fit: BoxFit.fitWidth,
108 | ),
109 | ),
110 | Align(
111 | alignment: Alignment.center,
112 | child: Padding(
113 | padding: EdgeInsets.all(4.0),
114 | child: Play(file:fileList[index]),
115 | ),
116 | ),
117 | ],
118 | )
119 | ],
120 | );
121 | },
122 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
123 | crossAxisCount: 3,
124 | mainAxisSpacing: 1.0,
125 | crossAxisSpacing: 10.0,
126 | childAspectRatio: 0.9,
127 | ),
128 | ),
129 | );
130 | } else {
131 | return Scaffold(
132 | body: Center(
133 | child: new Container(
134 | padding: EdgeInsets.only(bottom: 60.0),
135 | child: Text(
136 | 'Sorry, No Downloads Found!',
137 | style: TextStyle(fontSize: 18.0),
138 | )),
139 | ),
140 | );
141 | }
142 | }
143 | }
144 | }
145 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/whatsappDownload/imageScreen.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:flutter/material.dart';
3 | import 'package:reddit_video_downloader/constants/appConstant.dart';
4 |
5 |
6 | final Directory _photoDir = Directory('/storage/emulated/0/WhatsApp/Media/.Statuses');
7 | Directory dir = Directory('/storage/emulated/0/DownloadIt/WhatsApp');
8 |
9 | class WAImageScreen extends StatefulWidget {
10 | final GlobalKey scaffoldKey;
11 | WAImageScreen({Key key, this.scaffoldKey}) : super(key: key);
12 |
13 | @override
14 | _WAImageScreenState createState() => _WAImageScreenState(scaffoldKey: scaffoldKey);
15 | }
16 |
17 | class _WAImageScreenState extends State {
18 | GlobalKey scaffoldKey;
19 | _WAImageScreenState({Key key, this.scaffoldKey});
20 |
21 | Future _downloadFile(String filePath) async {
22 | File originalVideoFile = File(filePath);
23 | String filename = 'WA-${DateTime.now().year}${DateTime.now().month}${DateTime.now().day}${DateTime.now().hour}${DateTime.now().minute}${DateTime.now().second}${DateTime.now().millisecond}.jpg';
24 | String path = dir.path;
25 | String newFileName = "$path/$filename";
26 |
27 | await originalVideoFile.copy(newFileName);
28 | }
29 |
30 | @override
31 | void initState() {
32 | super.initState();
33 | if (!dir.existsSync()) {
34 | dir.createSync(recursive: true);
35 | }
36 | }
37 |
38 | @override
39 | Widget build(BuildContext context) {
40 | if (!Directory("${_photoDir.path}").existsSync()) {
41 | return Center(
42 | child: Text(
43 | "Install WhatsApp Now\nYour Friend's Status Will Be Available Here",
44 | style: TextStyle(fontSize: 18.0),
45 | ),
46 | );
47 | } else {
48 | var imageList = _photoDir.listSync().map((item) => item.path).where((item) => item.endsWith(".jpg")).toList(growable: false);
49 | if (imageList.length > 0) {
50 | return Container(
51 | padding: EdgeInsets.only(bottom: 20.0),
52 | margin: EdgeInsets.all(8.0),
53 | child: GridView.builder(
54 | itemCount: imageList.length,
55 | itemBuilder: (context, index) {
56 | String imgPath = imageList[index];
57 | return Column(
58 | children: [
59 | Container(
60 | height: screenHeightSize(120, context),
61 | decoration: BoxDecoration(
62 | shape: BoxShape.rectangle,
63 | color: Theme.of(context).primaryColor,
64 | ),
65 | child: Image.file(
66 | File(imgPath),
67 | fit: BoxFit.fitWidth,
68 | ),
69 | ),
70 | Padding(
71 | padding: EdgeInsets.only(top: 5.0),
72 | child: RaisedButton(
73 | child: Text( 'Download',style: TextStyle(color: Colors.blue),),
74 | padding: EdgeInsets.all(5.0),
75 | // color: Theme.of(context).accentColor,
76 | onPressed: () async {
77 | _downloadFile(imgPath);
78 | scaffoldKey.currentState.showSnackBar(mySnackBar(context, 'Image Stored at DownloadIt/WhatsApp'));
79 | },
80 | ),
81 | ),
82 | ],
83 | );
84 | },
85 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
86 | crossAxisCount: 3,
87 | mainAxisSpacing: 5.0,
88 | crossAxisSpacing: 10.0,
89 | childAspectRatio: 0.5,
90 | ),
91 | ),
92 | );
93 | } else {
94 | return Scaffold(
95 | body: Center(
96 | child: new Container(
97 | padding: EdgeInsets.only(bottom: 60.0),
98 | child: Text(
99 | 'Sorry, No Image Found!',
100 | style: TextStyle(fontSize: 18.0),
101 | )),
102 | ),
103 | );
104 | }
105 | }
106 | }
107 | }
108 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/whatsappDownload/videoScreen.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'package:flutter/material.dart';
3 | import 'package:progressive_image/progressive_image.dart';
4 | import 'package:reddit_video_downloader/constants/appConstant.dart';
5 |
6 |
7 | final Directory _videoDir = Directory('/storage/emulated/0/WhatsApp/Media/.Statuses');
8 | Directory dir = Directory('/storage/emulated/0/DownloadIt/WhatsApp');
9 | Directory thumbDir = Directory('/storage/emulated/0/.downloadit/.thumbs/');
10 |
11 | class WAVideoScreen extends StatefulWidget {
12 | final GlobalKey scaffoldKey;
13 | WAVideoScreen({Key key, this.scaffoldKey}) : super(key: key);
14 |
15 | @override
16 | _WAVideoScreenState createState() => _WAVideoScreenState(scaffoldKey: scaffoldKey);
17 | }
18 |
19 | class _WAVideoScreenState extends State {
20 | GlobalKey scaffoldKey;
21 | String tmpThumbnail;
22 | _WAVideoScreenState({Key key, this.scaffoldKey});
23 |
24 | Future _downloadFile(String filePath) async {
25 | File originalVideoFile = File(filePath);
26 | String filename = 'WA-${DateTime.now().year}${DateTime.now().month}${DateTime.now().day}${DateTime.now().hour}${DateTime.now().minute}${DateTime.now().second}${DateTime.now().millisecond}.mp4';
27 | String path = dir.path;
28 | String newFileName = "$path/$filename";
29 |
30 | File thumbFile = File(tmpThumbnail);
31 | String thumbname = filename.replaceAll('.mp4', '.jpg');
32 | String newThumbName = '${thumbDir.path}/$thumbname';
33 |
34 | await thumbFile.copy(newThumbName);
35 |
36 | await originalVideoFile.copy(newFileName);
37 | }
38 |
39 | @override
40 | void initState() {
41 | super.initState();
42 | if (!dir.existsSync()) {
43 | dir.createSync(recursive: true);
44 | }
45 | if (!thumbDir.existsSync()) {
46 | thumbDir.createSync(recursive: true);
47 | }
48 | }
49 |
50 | @override
51 | Widget build(BuildContext context) {
52 | if (!Directory("${_videoDir.path}").existsSync()) {
53 | return Center(
54 | child: Text(
55 | "Install WhatsApp\nYour Friend's Status will be available here.",
56 | style: TextStyle(fontSize: 18.0),
57 | ),
58 | );
59 | } else {
60 | var videoList = _videoDir.listSync().map((item) => item.path).where((item) => item.endsWith(".mp4")).toList(growable: false);
61 |
62 | if (videoList != null) {
63 | if (videoList.length > 0) {
64 | return Container(
65 | padding: EdgeInsets.only(bottom: 30.0),
66 | margin: EdgeInsets.all(8.0),
67 | child: GridView.builder(
68 | itemCount: videoList.length,
69 | itemBuilder: (context, index) {
70 | String videoPath = videoList[index];
71 | String thumbnailPath = thumbDir.path + '/' + videoPath.substring(45, videoPath.length - 4) + '.png';
72 | return Column(
73 | children: [
74 | Container(
75 | height: screenHeightSize(120, context),
76 | decoration: BoxDecoration(
77 | shape: BoxShape.rectangle,
78 | color: Theme.of(context).primaryColor,
79 | ),
80 | child: Stack(
81 | children: [
82 | ProgressiveImage(
83 | placeholder: AssetImage('assets/images/placeholder_video.gif'),
84 | thumbnail: FileImage(File(thumbnailPath)),
85 | image: FileImage(File(thumbnailPath)),
86 | width: double.infinity,
87 | height: double.infinity,
88 | fit: BoxFit.cover,
89 | ),
90 | Align(
91 | alignment: Alignment.topCenter,
92 | child: Padding(
93 | padding: EdgeInsets.all(4.0),
94 | child: Icon(Icons.videocam),
95 | ),
96 | ),
97 | ],
98 | ),
99 | ),
100 | Padding(
101 | padding: EdgeInsets.only(top: 5.0),
102 | child: RaisedButton(
103 | child: Text( 'Download',style: TextStyle(color: Colors.blue),),
104 | padding: EdgeInsets.all(5.0),
105 | // color: Theme.of(context).accentColor,
106 | onPressed: () {
107 | tmpThumbnail = thumbnailPath;
108 | _downloadFile(videoPath);
109 | scaffoldKey.currentState.showSnackBar(mySnackBar(context, 'Video Stored at DownloadIt/WhatsApp'));
110 | },
111 | ),
112 | ),
113 | SizedBox(
114 | height: 10,
115 | ),
116 | ],
117 | );
118 | },
119 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
120 | crossAxisCount: 3,
121 | mainAxisSpacing: 5.0,
122 | crossAxisSpacing: 10.0,
123 | childAspectRatio: 0.5,
124 | ),
125 | ),
126 | );
127 | } else {
128 | return Center(
129 | child: Text(
130 | "Sorry, No Videos Found.",
131 | style: TextStyle(fontSize: 18.0),
132 | ),
133 | );
134 | }
135 | } else {
136 | return Center(
137 | child: CircularProgressIndicator(),
138 | );
139 | }
140 | }
141 | }
142 | }
143 |
--------------------------------------------------------------------------------
/DownloadIT/lib/screens/whatsappDownload/whatsappDownloadScreen.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 | import 'dart:ui';
3 | import 'package:firebase_admob/firebase_admob.dart';
4 | import 'package:flutter/material.dart';
5 | import 'package:reddit_video_downloader/constants/appConstant.dart';
6 | import 'package:reddit_video_downloader/helper/AdsHelper.dart';
7 | import 'package:reddit_video_downloader/screens/whatsappDownload/imageScreen.dart';
8 | import 'package:reddit_video_downloader/screens/whatsappDownload/videoScreen.dart';
9 |
10 | import 'package:video_thumbnail/video_thumbnail.dart';
11 | const String testDevice = 'MobileId';
12 |
13 | final Directory _videoDir = Directory('/storage/emulated/0/WhatsApp/Media/.Statuses/');
14 | final Directory thumbDir = Directory('/storage/emulated/0/.downloadit/.thumbs/');
15 |
16 | class WhatsappDownload extends StatefulWidget {
17 | @override
18 | _WhatsappDownloadState createState() => _WhatsappDownloadState();
19 | }
20 |
21 | class _WhatsappDownloadState extends State with TickerProviderStateMixin {
22 | TabController _whatsappTabController;
23 | var _scaffoldKey = new GlobalKey();
24 | static const MobileAdTargetingInfo targetingInfo = MobileAdTargetingInfo(
25 | testDevices: testDevice != null ? [testDevice] : null,
26 | nonPersonalizedAds: true,
27 | keywords: ['video', 'download'],
28 | );
29 | BannerAd _bannerAd;
30 |
31 |
32 | BannerAd createBannerAd() {
33 | return BannerAd(
34 | adUnitId:AdsHelper.bannerAds,
35 | //Change BannerAd adUnitId with Admob ID
36 | size: AdSize.smartBanner,
37 | targetingInfo: targetingInfo,
38 | listener: (MobileAdEvent event) {
39 | print("BannerAd $event");
40 | });
41 | }
42 |
43 | _loadthumb() async {
44 | if (Directory("${_videoDir.path}").existsSync()) {
45 | var videoList = _videoDir.listSync().map((item) => item.path).where((item) => item.endsWith(".mp4")).toList(growable: false);
46 |
47 | for (var x in videoList) {
48 | var tmp = x.replaceAll(_videoDir.path.toString(), '');
49 |
50 | if (!File(thumbDir.path.toString() + tmp.substring(0, tmp.length - 4) + '.png').existsSync()) {
51 | await VideoThumbnail.thumbnailFile(
52 | video: x,
53 | thumbnailPath: thumbDir.path,
54 | imageFormat: ImageFormat.PNG,
55 | );
56 | }
57 | }
58 | }
59 | }
60 |
61 | @override
62 | void initState() {
63 | super.initState();
64 | _bannerAd = createBannerAd()
65 | ..load().then((loaded) {
66 | if (loaded && this.mounted) {
67 | _bannerAd..show();
68 | }
69 |
70 | });
71 | _whatsappTabController = TabController(length: 2, vsync: this);
72 | if (!thumbDir.existsSync()) {
73 | thumbDir.createSync(recursive: true);
74 | }
75 | _loadthumb();
76 | }
77 |
78 | @override
79 | void dispose() {
80 | super.dispose();
81 | _bannerAd.dispose();
82 | _whatsappTabController.dispose();
83 | }
84 |
85 | @override
86 | Widget build(BuildContext context) {
87 | return Scaffold(
88 | key: _scaffoldKey,
89 | appBar: screenAppBar("WhatsApp Downloader"),
90 | body: SingleChildScrollView(
91 | physics: BouncingScrollPhysics(),
92 | child: Column(
93 | children: [
94 | Container(
95 | child: TabBar(controller: _whatsappTabController, indicatorColor: Colors.blue, labelColor: Colors.blue, unselectedLabelColor: Colors.blueGrey, labelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 14.0), isScrollable: false, unselectedLabelStyle: TextStyle(fontWeight: FontWeight.w500, fontSize: 12.0), tabs: [
96 | Container(
97 | child: Padding(
98 | padding: EdgeInsets.symmetric(vertical: 15),
99 | child: Row(
100 | mainAxisAlignment: MainAxisAlignment.center,
101 | children: [
102 | Icon(Icons.photo_library),
103 | Padding(
104 | padding: EdgeInsets.symmetric(horizontal: 8.0),
105 | child: Text('IMAGES'),
106 | ),
107 | ],
108 | ),
109 | ),
110 | ),
111 | Container(
112 | child: Padding(
113 | padding: EdgeInsets.symmetric(vertical: 15),
114 | child: Row(
115 | mainAxisAlignment: MainAxisAlignment.center,
116 | children: [
117 | Icon(Icons.live_tv),
118 | Padding(
119 | padding: EdgeInsets.symmetric(horizontal: 8.0),
120 | child: Text('VIDEOS'),
121 | ),
122 | ],
123 | ),
124 | ),
125 | ),
126 | ]),
127 | ),
128 | Container(
129 | height: screenHeightSize(500, context),
130 | child: TabBarView(
131 | controller: _whatsappTabController,
132 | children: [
133 | WAImageScreen(
134 | scaffoldKey: _scaffoldKey,
135 | ),
136 | WAVideoScreen(
137 | scaffoldKey: _scaffoldKey,
138 | ),
139 | ],
140 | ),
141 | ),
142 | ],
143 | ),
144 | ),
145 | );
146 | }
147 | }
148 |
--------------------------------------------------------------------------------
/DownloadIT/lib/utils.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:http/http.dart' as http;
3 |
4 | const String THREAD_EXP = r'https:\/\/www\.reddit\.com\/r\/.+\/comments\/.+';
5 | const String VIDEO_EXP = r'https:\/\/v\.redd\.it\/.+';
6 | const String VIDEO2_EXP = r'https:\/\/www\.reddit\.com\/video\/.+';
7 | const String DASH_EXP = r'https:\/\/v\.redd\.it\/.+\/DASHPlaylist.mpd';
8 |
9 | class Utils {
10 |
11 | static bool isThreadUrl(String url) {
12 | RegExp exp = new RegExp(THREAD_EXP);
13 | return exp.firstMatch(url) != null;
14 | }
15 |
16 | static String removeQueryParams(String url) {
17 | RegExp noParamsExp = new RegExp(r'[^\?]*');
18 | RegExpMatch urlMatch = noParamsExp.firstMatch(url);
19 | return urlMatch.group(0);
20 | }
21 |
22 | static String parseThreadUrl(String url) {
23 | if (!url.endsWith('/')) {
24 | url += '/';
25 | }
26 | url += '.json';
27 |
28 | return url;
29 | }
30 |
31 | static RedditUrls getUrlType(String url) {
32 | RegExp threadExp = new RegExp(THREAD_EXP);
33 | RegExp videoExp = new RegExp(VIDEO_EXP);
34 | RegExp video2Exp = new RegExp(VIDEO2_EXP);
35 | RegExp dashExp = new RegExp(DASH_EXP);
36 |
37 | if (threadExp.firstMatch(url) != null) {
38 | return RedditUrls.THREAD;
39 | } else if (dashExp.firstMatch(url) != null) {
40 | return RedditUrls.DASH;
41 | } else if (videoExp.firstMatch(url) != null) {
42 | return RedditUrls.VIDEO;
43 | } else if (video2Exp.firstMatch(url) != null) {
44 | return RedditUrls.VIDEO2;
45 | } else {
46 | return RedditUrls.INVALID;
47 | }
48 | }
49 |
50 | static Future getThreadUrlFromVideoUrl(String url) async {
51 | debugPrint('url: $url');
52 |
53 | final client = new http.Client();
54 | final request = new http.Request('GET', Uri.parse(url))
55 | ..followRedirects = false;
56 | final response = await client.send(request);
57 |
58 | debugPrint('url: $url');
59 |
60 |
61 | String redirectUrl = response.headers['location'];
62 | debugPrint(redirectUrl);
63 | if (isThreadUrl(redirectUrl)) {
64 | return redirectUrl;
65 | } else {
66 | final secondRequest = new http.Request('GET', Uri.parse(redirectUrl))
67 | ..followRedirects = false;
68 | final secondResponse = await client.send(secondRequest);
69 | String secondRedirectUrl = secondResponse.headers['location'];
70 | debugPrint(secondRedirectUrl);
71 | if (isThreadUrl(secondRedirectUrl)) {
72 | return secondRedirectUrl;
73 | } else {
74 | return null;
75 | }
76 | }
77 |
78 | }
79 |
80 | }
81 |
82 | enum RedditUrls {
83 | THREAD,
84 | VIDEO,
85 | VIDEO2,
86 | DASH,
87 | INVALID
88 | }
89 |
--------------------------------------------------------------------------------
/DownloadIT/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: reddit_video_downloader
2 | description: A new Flutter application.
3 |
4 | # The following defines the version and build number for your application.
5 | # A version number is three numbers separated by dots, like 1.2.43
6 | # followed by an optional build number separated by a +.
7 | # Both the version and the builder number may be overridden in flutter
8 | # build by specifying --build-name and --build-number, respectively.
9 | # In Android, build-name is used as versionName while build-number used as versionCode.
10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning
11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
12 | # Read more about iOS versioning at
13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
14 | version: 0.0.1+1
15 |
16 | environment:
17 | sdk: ">=2.1.0 <3.0.0"
18 |
19 | dependencies:
20 | flutter:
21 | sdk: flutter
22 | http: ^0.12.0+2
23 | flutter_ffmpeg: ^0.2.8
24 | path_provider: ^1.4.2
25 | permission_handler: ^4.0.0
26 | flutter_redux: ^0.5.4
27 | redux_epics: ^0.11.0
28 | url_launcher: ^5.5.0
29 | share: ^0.6.4+3
30 | bottom_navy_bar: ^5.4.0
31 | video_thumbnail: ^0.2.2
32 | connectivity:
33 | backdrop: ^0.4.3
34 | video_player: ^0.10.11+2
35 | chewie: ^0.9.10
36 | image_gallery_saver: ^1.5.0
37 | flutter_downloader: ^1.4.4
38 | share_extend: "^1.1.9"
39 | firebase_admob: ^0.9.3+4
40 | fluttertoast: 7.0.3
41 | flutter_native_admob: ^2.1.0
42 | percent_indicator: "^2.1.5"
43 | cached_network_image:
44 | lottie: ^0.5.0
45 | google_fonts: ^0.4.0
46 | html: ^0.14.0+3
47 | progressive_image: ^1.0.1
48 |
49 |
50 |
51 |
52 | # The following adds the Cupertino Icons font to your application.
53 | # Use with the CupertinoIcons class for iOS style icons.
54 | cupertino_icons: ^0.1.2
55 |
56 | dev_dependencies:
57 | flutter_test:
58 | sdk: flutter
59 | flutter_launcher_icons: ^0.7.5
60 |
61 |
62 | flutter_icons:
63 | image_path: 'assets/icon/icon.png'
64 | android: true
65 | ios: true
66 |
67 |
68 | # For information on the generic Dart part of this file, see the
69 | # following page: https://dart.dev/tools/pub/pubspec
70 |
71 | # The following section is specific to Flutter.
72 | flutter:
73 |
74 | # The following line ensures that the Material Icons font is
75 | # included with your application, so that you can use the icons in
76 | # the material Icons class.
77 | uses-material-design: true
78 |
79 | # To add assets to your application, add an assets section, like this:
80 | assets:
81 | - assets/images/
82 | - assets/icon/
83 | fonts:
84 | - family: Billabong
85 | fonts:
86 | - asset: assets/fonts/Billabong.ttf
87 | - family: WorkSans
88 | fonts:
89 | - asset: assets/fonts/WorkSans-Regular.ttf
90 | - asset: assets/fonts/WorkSans-Medium.ttf
91 | weight: 500
92 | - asset: assets/fonts/WorkSans-SemiBold.ttf
93 | weight: 600
94 | - asset: assets/fonts/WorkSans-Bold.ttf
95 | weight: 700
--------------------------------------------------------------------------------
/DownloadIT/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility that Flutter provides. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_test/flutter_test.dart';
10 |
11 | import 'package:reddit_video_downloader/main.dart';
12 |
13 | void main() {
14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // Build our app and trigger a frame.
16 | await tester.pumpWidget(MyApp());
17 |
18 | // Verify that our counter starts at 0.
19 | expect(find.text('0'), findsOneWidget);
20 | expect(find.text('1'), findsNothing);
21 |
22 | // Tap the '+' icon and trigger a frame.
23 | await tester.tap(find.byIcon(Icons.add));
24 | await tester.pump();
25 |
26 | // Verify that our counter has incremented.
27 | expect(find.text('0'), findsNothing);
28 | expect(find.text('1'), findsOneWidget);
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Flutter-Download-App
2 | Flutter app for downloading videos and images from Instagram, WhatsApp, Facebook, Tiktok, Reddit
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | ## Getting Started
52 |
53 | This project is a starting point for a Flutter application.
54 |
55 | A few resources to get you started if this is your first Flutter project:
56 |
57 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
58 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
59 |
60 | For help getting started with Flutter, view our
61 | [online documentation](https://flutter.dev/docs), which offers tutorials,
62 | samples, guidance on mobile development, and a full API reference.
63 |
--------------------------------------------------------------------------------