├── 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 | Flutter-Download-App 7 |

8 | 9 |

10 | Flutter-Download-App 11 |

12 | 13 |

14 | Flutter-Download-App 15 |

16 | 17 |

18 | Flutter-Download-App 19 |

20 |

21 | Flutter-Download-App 22 |

23 |

24 | Flutter-Download-App 25 |

26 |

27 | Flutter-Download-App 28 |

29 |

30 | Flutter-Download-App 31 |

32 |

33 | Flutter-Download-App 34 |

35 |

36 | Flutter-Download-App 37 |

38 |

39 | Flutter-Download-App 40 |

41 |

42 | Flutter-Download-App 43 |

44 |

45 | Flutter-Download-App 46 |

47 |

48 | Flutter-Download-App 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 | --------------------------------------------------------------------------------