├── .gitignore ├── .metadata ├── .vscode └── launch.json ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── trendy_whatsapp_stickers │ │ │ │ └── MainActivity.java │ │ └── res │ │ │ ├── drawable-v21 │ │ │ └── launch_background.xml │ │ │ ├── drawable │ │ │ └── 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-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── assets └── images │ └── logo.png ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── 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 ├── Widgets │ ├── Admob.dart │ ├── Drawer.dart │ └── sticker_pack_item.dart ├── constants │ └── constants.dart ├── main.dart ├── models │ └── sticker_data.dart └── screens │ ├── information_screen.dart │ ├── sticker_pack_info.dart │ └── stickers_screen.dart ├── plugins └── whatsapp_stickers_handler │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── analysis_options.yaml │ ├── android │ ├── .gitignore │ ├── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ ├── settings.gradle │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── com │ │ └── indiagenisys │ │ └── whatsapp_stickers_handler │ │ ├── ConfigFileManager.java │ │ ├── ContentFileParser.java │ │ ├── InvalidPackException.java │ │ ├── Sticker.java │ │ ├── StickerContentProvider.java │ │ ├── StickerPack.java │ │ ├── StickerPackLoader.java │ │ ├── StickerPackValidator.java │ │ ├── WhatsappStickersHandlerPlugin.kt │ │ └── WhitelistCheck.java │ ├── ios │ ├── .gitignore │ ├── Assets │ │ └── .gitkeep │ ├── Classes │ │ ├── SwiftWhatsappStickersHandlerPlugin.swift │ │ ├── WhatsappStickersHandlerPlugin.h │ │ └── WhatsappStickersHandlerPlugin.m │ └── whatsapp_stickers_handler.podspec │ ├── lib │ ├── exceptions.dart │ └── whatsapp_stickers_handler.dart │ ├── pubspec.lock │ ├── pubspec.yaml │ └── test │ └── whatsapp_stickers_handler_test.dart ├── pubspec.lock ├── pubspec.yaml ├── sticker_packs ├── 1 │ ├── 1.png │ ├── 1.webp │ ├── 10.webp │ ├── 11.webp │ ├── 12.webp │ ├── 13.webp │ ├── 14.webp │ ├── 15.webp │ ├── 16.webp │ ├── 17.webp │ ├── 18.webp │ ├── 19.webp │ ├── 2.webp │ ├── 20.webp │ ├── 21.webp │ ├── 22.webp │ ├── 23.webp │ ├── 24.webp │ ├── 3.webp │ ├── 4.webp │ ├── 5.webp │ ├── 6.webp │ ├── 7.webp │ ├── 8.webp │ └── 9.webp ├── 2 │ ├── 1.png │ ├── 1.webp │ ├── 10.webp │ ├── 11.webp │ ├── 12.webp │ ├── 13.webp │ ├── 14.webp │ ├── 15.webp │ ├── 16.webp │ ├── 17.webp │ ├── 18.webp │ ├── 19.webp │ ├── 2.webp │ ├── 20.webp │ ├── 21.webp │ ├── 22.webp │ ├── 23.webp │ ├── 24.webp │ ├── 25.webp │ ├── 26.webp │ ├── 3.webp │ ├── 4.webp │ ├── 5.webp │ ├── 6.webp │ ├── 7.webp │ ├── 8.webp │ └── 9.webp ├── 3 │ ├── 1.png │ ├── 1.webp │ ├── 10.webp │ ├── 11.webp │ ├── 12.webp │ ├── 13.webp │ ├── 14.webp │ ├── 15.webp │ ├── 16.webp │ ├── 17.webp │ ├── 18.webp │ ├── 19.webp │ ├── 2.webp │ ├── 20.webp │ ├── 21.webp │ ├── 22.webp │ ├── 23.webp │ ├── 24.webp │ ├── 25.webp │ ├── 26.webp │ ├── 27.webp │ ├── 28.webp │ ├── 29.webp │ ├── 3.webp │ ├── 30.webp │ ├── 4.webp │ ├── 5.webp │ ├── 6.webp │ ├── 7.webp │ ├── 8.webp │ └── 9.webp ├── 4 │ ├── 1.png │ ├── 1.webp │ ├── 10.webp │ ├── 11.webp │ ├── 12.webp │ ├── 13.webp │ ├── 14.webp │ ├── 15.webp │ ├── 16.webp │ ├── 17.webp │ ├── 18.webp │ ├── 19.webp │ ├── 2.webp │ ├── 20.webp │ ├── 21.webp │ ├── 22.webp │ ├── 23.webp │ ├── 24.webp │ ├── 25.webp │ ├── 26.webp │ ├── 27.webp │ ├── 28.webp │ ├── 29.webp │ ├── 3.webp │ ├── 30.webp │ ├── 4.webp │ ├── 5.webp │ ├── 6.webp │ ├── 7.webp │ ├── 8.webp │ └── 9.webp ├── 5 │ ├── 1.png │ ├── 1.webp │ ├── 10.webp │ ├── 11.webp │ ├── 12.webp │ ├── 13.webp │ ├── 14.webp │ ├── 15.webp │ ├── 16.webp │ ├── 17.webp │ ├── 18.webp │ ├── 19.webp │ ├── 2.webp │ ├── 20.webp │ ├── 21.webp │ ├── 22.webp │ ├── 23.webp │ ├── 24.webp │ ├── 25.webp │ ├── 26.webp │ ├── 27.webp │ ├── 28.webp │ ├── 29.webp │ ├── 3.webp │ ├── 30.webp │ ├── 4.webp │ ├── 5.webp │ ├── 6.webp │ ├── 7.webp │ ├── 8.webp │ └── 9.webp ├── 6 │ ├── 1.png │ ├── 1.webp │ ├── 10.webp │ ├── 11.webp │ ├── 12.webp │ ├── 13.webp │ ├── 14.webp │ ├── 15.webp │ ├── 16.webp │ ├── 17.webp │ ├── 18.webp │ ├── 19.webp │ ├── 2.webp │ ├── 20.webp │ ├── 21.webp │ ├── 22.webp │ ├── 23.webp │ ├── 24.webp │ ├── 25.webp │ ├── 26.webp │ ├── 27.webp │ ├── 28.webp │ ├── 29.webp │ ├── 3.webp │ ├── 30.webp │ ├── 4.webp │ ├── 5.webp │ ├── 6.webp │ ├── 7.webp │ ├── 8.webp │ └── 9.webp ├── 7 │ ├── 1.png │ ├── 1.webp │ ├── 10.webp │ ├── 11.webp │ ├── 12.webp │ ├── 13.webp │ ├── 14.webp │ ├── 15.webp │ ├── 16.webp │ ├── 17.webp │ ├── 18.webp │ ├── 19.webp │ ├── 2.webp │ ├── 20.webp │ ├── 3.webp │ ├── 4.webp │ ├── 5.webp │ ├── 6.webp │ ├── 7.webp │ ├── 8.webp │ └── 9.webp └── sticker_packs.json └── test └── widget_test.dart /.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/**/GeneratedPluginRegistrant.java 41 | 42 | # iOS/XCode related 43 | **/ios/**/*.mode1v3 44 | **/ios/**/*.mode2v3 45 | **/ios/**/*.moved-aside 46 | **/ios/**/*.pbxuser 47 | **/ios/**/*.perspectivev3 48 | **/ios/**/*sync/ 49 | **/ios/**/.sconsign.dblite 50 | **/ios/**/.tags* 51 | **/ios/**/.vagrant/ 52 | **/ios/**/DerivedData/ 53 | **/ios/**/Icon? 54 | **/ios/**/Pods/ 55 | **/ios/**/.symlinks/ 56 | **/ios/**/profile 57 | **/ios/**/xcuserdata 58 | **/ios/.generated/ 59 | **/ios/Flutter/App.framework 60 | **/ios/Flutter/Flutter.framework 61 | **/ios/Flutter/Generated.xcconfig 62 | **/ios/Flutter/app.flx 63 | **/ios/Flutter/app.zip 64 | **/ios/Flutter/flutter_assets/ 65 | **/ios/ServiceDefinitions.json 66 | **/ios/Runner/GeneratedPluginRegistrant.* 67 | 68 | # Exceptions to above rules. 69 | !**/ios/**/default.mode1v3 70 | !**/ios/**/default.mode2v3 71 | !**/ios/**/default.pbxuser 72 | !**/ios/**/default.perspectivev3 73 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages 74 | -------------------------------------------------------------------------------- /.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. 5 | 6 | version: 7 | revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 8 | channel: stable 9 | 10 | project_type: app 11 | 12 | # Tracks metadata for the flutter migrate command 13 | migration: 14 | platforms: 15 | - platform: root 16 | create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 17 | base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 18 | - platform: android 19 | create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 20 | base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 21 | - platform: ios 22 | create_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 23 | base_revision: 52b3dc25f6471c27b2144594abb11c741cb88f57 24 | 25 | # User provided section 26 | 27 | # List of Local paths (relative to this file) that should be 28 | # ignored by the migrate tool. 29 | # 30 | # Files that are not part of the templates will be ignored by default. 31 | unmanaged_files: 32 | - 'lib/main.dart' 33 | - 'ios/Runner.xcodeproj/project.pbxproj' 34 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "trendy_whatsapp_stickers", 9 | "request": "launch", 10 | "type": "dart" 11 | }, 12 | { 13 | "name": "trendy_whatsapp_stickers (profile mode)", 14 | "request": "launch", 15 | "type": "dart", 16 | "flutterMode": "profile" 17 | }, 18 | { 19 | "name": "trendy_whatsapp_stickers (release mode)", 20 | "request": "launch", 21 | "type": "dart", 22 | "flutterMode": "release" 23 | }, 24 | { 25 | "name": "whatsapp_stickers_handler", 26 | "cwd": "plugins/whatsapp_stickers_handler", 27 | "request": "launch", 28 | "type": "dart" 29 | }, 30 | { 31 | "name": "whatsapp_stickers_handler (profile mode)", 32 | "cwd": "plugins/whatsapp_stickers_handler", 33 | "request": "launch", 34 | "type": "dart", 35 | "flutterMode": "profile" 36 | }, 37 | { 38 | "name": "whatsapp_stickers_handler (release mode)", 39 | "cwd": "plugins/whatsapp_stickers_handler", 40 | "request": "launch", 41 | "type": "dart", 42 | "flutterMode": "release" 43 | } 44 | ] 45 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WhatsApp Sticker App using Flutter 2 | 3 | ![full_screnshot](https://user-images.githubusercontent.com/13075784/85202566-d57aa280-b324-11ea-8098-38757234c388.png) 4 | 5 | # Available in PlayStore 6 | 7 | ![640px-Google_Play_Store_badge_EN svg](https://user-images.githubusercontent.com/13075784/85202629-55087180-b325-11ea-8307-acf71c9b7022.png) 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | # This file configures the analyzer, which statically analyzes Dart code to 2 | # check for errors, warnings, and lints. 3 | # 4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled 5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be 6 | # invoked from the command line by running `flutter analyze`. 7 | 8 | # The following line activates a set of recommended lints for Flutter apps, 9 | # packages, and plugins designed to encourage good coding practices. 10 | include: package:flutter_lints/flutter.yaml 11 | 12 | analyzer: 13 | exclude: 14 | - plugins 15 | 16 | linter: 17 | # The lint rules applied to this project can be customized in the 18 | # section below to disable rules from the `package:flutter_lints/flutter.yaml` 19 | # included above or to enable additional rules. A list of all available lints 20 | # and their documentation is published at 21 | # https://dart-lang.github.io/linter/lints/index.html. 22 | # 23 | # Instead of disabling a lint rule for the entire project in the 24 | # section below, it can also be suppressed for a single line of code 25 | # or a specific dart file by using the `// ignore: name_of_lint` and 26 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file 27 | # producing the lint. 28 | rules: 29 | prefer_const_constructors: false, 30 | # avoid_print: false # Uncomment to disable the `avoid_print` rule 31 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule 32 | 33 | # Additional information about this file can be found at 34 | # https://dart.dev/guides/language/analysis-options 35 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /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 | android { 29 | aaptOptions { 30 | noCompress "webp" 31 | } 32 | compileSdkVersion 33 33 | 34 | compileOptions { 35 | sourceCompatibility JavaVersion.VERSION_1_8 36 | targetCompatibility JavaVersion.VERSION_1_8 37 | } 38 | 39 | defaultConfig { 40 | multiDexEnabled true 41 | applicationId "com.example.trendy_whatsapp_stickers" 42 | minSdkVersion flutter.minSdkVersion 43 | targetSdkVersion 33 44 | versionCode flutterVersionCode.toInteger() 45 | versionName flutterVersionName 46 | } 47 | 48 | buildTypes { 49 | release { 50 | signingConfig signingConfigs.debug 51 | } 52 | } 53 | } 54 | dependencies { 55 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 56 | implementation "androidx.multidex:multidex:2.0.1" 57 | } 58 | 59 | flutter { 60 | source '../..' 61 | } 62 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 18 | 22 | 25 | 26 | 27 | 28 | 29 | 30 | 32 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/example/trendy_whatsapp_stickers/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.trendy_whatsapp_stickers; 2 | 3 | import io.flutter.embedding.android.FlutterActivity; 4 | 5 | public class MainActivity extends FlutterActivity { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.6.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.1.2' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip 6 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/assets/images/logo.png -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 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 | 11.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment this line to define a global platform for your project 2 | # platform :ios, '11.0' 3 | 4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency. 5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true' 6 | 7 | project 'Runner', { 8 | 'Debug' => :debug, 9 | 'Profile' => :release, 10 | 'Release' => :release, 11 | } 12 | 13 | def flutter_root 14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) 15 | unless File.exist?(generated_xcode_build_settings_path) 16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" 17 | end 18 | 19 | File.foreach(generated_xcode_build_settings_path) do |line| 20 | matches = line.match(/FLUTTER_ROOT\=(.*)/) 21 | return matches[1].strip if matches 22 | end 23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" 24 | end 25 | 26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) 27 | 28 | flutter_ios_podfile_setup 29 | 30 | target 'Runner' do 31 | use_frameworks! 32 | use_modular_headers! 33 | 34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) 35 | end 36 | 37 | post_install do |installer| 38 | installer.pods_project.targets.each do |target| 39 | flutter_additional_ios_build_settings(target) 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Flutter (1.0.0) 3 | - path_provider_ios (0.0.1): 4 | - Flutter 5 | - share_plus (0.0.1): 6 | - Flutter 7 | - url_launcher_ios (0.0.1): 8 | - Flutter 9 | - whatsapp_stickers_handler (0.0.1): 10 | - Flutter 11 | 12 | DEPENDENCIES: 13 | - Flutter (from `Flutter`) 14 | - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) 15 | - share_plus (from `.symlinks/plugins/share_plus/ios`) 16 | - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) 17 | - whatsapp_stickers_handler (from `.symlinks/plugins/whatsapp_stickers_handler/ios`) 18 | 19 | EXTERNAL SOURCES: 20 | Flutter: 21 | :path: Flutter 22 | path_provider_ios: 23 | :path: ".symlinks/plugins/path_provider_ios/ios" 24 | share_plus: 25 | :path: ".symlinks/plugins/share_plus/ios" 26 | url_launcher_ios: 27 | :path: ".symlinks/plugins/url_launcher_ios/ios" 28 | whatsapp_stickers_handler: 29 | :path: ".symlinks/plugins/whatsapp_stickers_handler/ios" 30 | 31 | SPEC CHECKSUMS: 32 | Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 33 | path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 34 | share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 35 | url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de 36 | whatsapp_stickers_handler: b230937b02314e89c56f3e120792381c45b3e6db 37 | 38 | PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 39 | 40 | COCOAPODS: 1.11.3 41 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 69 | 71 | 77 | 78 | 79 | 80 | 82 | 83 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /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. -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | Trendy Whatsapp Stickers 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | trendy_whatsapp_stickers 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(FLUTTER_BUILD_NAME) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(FLUTTER_BUILD_NUMBER) 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UIViewControllerBasedStatusBarAppearance 45 | 46 | CADisableMinimumFrameDurationOnPhone 47 | 48 | UIApplicationSupportsIndirectInputEvents 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /lib/Widgets/Admob.dart: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/lib/Widgets/Admob.dart -------------------------------------------------------------------------------- /lib/Widgets/Drawer.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:share_plus/share_plus.dart'; 3 | import 'package:url_launcher/url_launcher_string.dart'; 4 | 5 | class MyDrawer extends StatelessWidget { 6 | static const TextStyle _menuTextColor = TextStyle( 7 | color: Colors.teal, 8 | fontSize: 14.0, 9 | fontWeight:FontWeight.w500, 10 | ); 11 | 12 | static const IconThemeData _iconColor = IconThemeData( 13 | color: Colors.teal, 14 | ); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Container( 19 | color: Colors.white, 20 | child: ListView( 21 | padding: EdgeInsets.all(0), 22 | children: [ 23 | UserAccountsDrawerHeader( 24 | accountName: Text("Trendy Stickers", 25 | style: TextStyle( 26 | fontSize:20.0, 27 | ),), 28 | accountEmail: Text("Awesome Trending Stickers"), 29 | // currentAccountPicture: Image.asset('assets/images/avatar.png'), 30 | ), 31 | ListTile( 32 | leading: IconTheme( 33 | data: _iconColor, 34 | child: Icon(Icons.share), 35 | ), 36 | title: Text("Share",style: _menuTextColor), 37 | onTap: () { 38 | Share.share("Download Best WhatsApp Stickers \n\n 👇👇👇👇👇 \nDownload Now\nhttps://play.google.com/store/apps/details?id=com.gamacrack.trending_stickers"); 39 | }, 40 | ), 41 | ListTile( 42 | leading: IconTheme( 43 | data: _iconColor, 44 | child: Icon(Icons.rate_review), 45 | ), 46 | title: Text("Rating & Review",style: _menuTextColor), 47 | onTap: () async { 48 | Navigator.of(context).pop(); 49 | const url = 'https://play.google.com/store/apps/details?id=com.gamacrack.trending_stickers&reviewId=0'; 50 | if (await canLaunchUrlString(url)) { 51 | await launchUrlString(url); 52 | } else { 53 | throw 'Could not open App'; 54 | } 55 | }, 56 | ), 57 | ListTile( 58 | leading: IconTheme( 59 | data: _iconColor, 60 | child: Icon(Icons.security), 61 | ), 62 | title: Text("Privacy Policy",style: _menuTextColor), 63 | onTap: () async {}, 64 | ), 65 | ], 66 | ), 67 | ); 68 | } 69 | } -------------------------------------------------------------------------------- /lib/Widgets/sticker_pack_item.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:trendy_whatsapp_stickers/constants/constants.dart'; 3 | import 'package:trendy_whatsapp_stickers/models/sticker_data.dart'; 4 | import 'package:trendy_whatsapp_stickers/screens/sticker_pack_info.dart'; 5 | import 'package:whatsapp_stickers_handler/exceptions.dart'; 6 | import 'package:whatsapp_stickers_handler/whatsapp_stickers_handler.dart'; 7 | 8 | class StickerPackItem extends StatelessWidget { 9 | final StickerPacks stickerPack; 10 | final String stickerFetchType; 11 | StickerPackItem({ 12 | Key? key, 13 | required this.stickerPack, 14 | required this.stickerFetchType, 15 | }) : super(key: key); 16 | 17 | Widget addStickerPackButton( 18 | bool isInstalled, WhatsappStickersHandler _whatsappStickersHandler) { 19 | stickerPack.isInstalled = isInstalled; 20 | 21 | return IconButton( 22 | icon: Icon( 23 | isInstalled ? Icons.check : Icons.add, 24 | ), 25 | color: Colors.teal, 26 | tooltip: isInstalled 27 | ? 'Add Sticker to WhatsApp' 28 | : 'Sticker is added to WhatsApp', 29 | onPressed: () async { 30 | Map> stickers = >{}; 31 | var tryImage = ''; 32 | for (var e in stickerPack.stickers!) { 33 | stickers[WhatsappStickerImageHandler.fromAsset( 34 | "sticker_packs/${stickerPack.identifier}/${e.imageFile as String}") 35 | .path] = e.emojis as List; 36 | } 37 | tryImage = WhatsappStickerImageHandler.fromAsset( 38 | "sticker_packs/${stickerPack.identifier}/${stickerPack.trayImageFile}") 39 | .path; 40 | try { 41 | await _whatsappStickersHandler.addStickerPack( 42 | stickerPack.identifier, 43 | stickerPack.name as String, 44 | stickerPack.publisher as String, 45 | tryImage, 46 | stickerPack.publisherWebsite, 47 | stickerPack.privacyPolicyWebsite, 48 | stickerPack.licenseAgreementWebsite, 49 | stickerPack.animatedStickerPack ?? false, 50 | stickers, 51 | ); 52 | } on WhatsappStickersException catch (e) { 53 | print(e.cause); 54 | } 55 | }, 56 | ); 57 | } 58 | 59 | @override 60 | Widget build(BuildContext context) { 61 | 62 | final WhatsappStickersHandler _whatsappStickersHandler = 63 | WhatsappStickersHandler(); 64 | return Container( 65 | padding: const EdgeInsets.symmetric(vertical: 8), 66 | child: SizedBox( 67 | child: ListTile( 68 | onTap: () { 69 | Navigator.of(context) 70 | .pushNamed(StickerPackInfoScreen.routeName, arguments: { 71 | 'stickerPack': stickerPack, 72 | 'stickerFetchType': stickerFetchType, 73 | }); 74 | }, 75 | title: Text(stickerPack.name ?? ""), 76 | subtitle: Text(stickerPack.publisher ?? ""), 77 | leading: stickerFetchType == "remoteStickers" 78 | ? FadeInImage( 79 | placeholder: const AssetImage("assets/images/loading.gif"), 80 | image: NetworkImage( 81 | "${BASE_URL}/${stickerPack.identifier}/${stickerPack.trayImageFile}"), 82 | ) 83 | : Image.asset( 84 | "sticker_packs/${stickerPack.identifier}/${stickerPack.trayImageFile}"), 85 | trailing: FutureBuilder( 86 | future: _whatsappStickersHandler 87 | .isStickerPackInstalled(stickerPack.identifier as String), 88 | builder: (BuildContext context, AsyncSnapshot snapshot) { 89 | return snapshot.connectionState == ConnectionState.waiting || snapshot.data == null 90 | ? const Text("+") 91 | : addStickerPackButton( 92 | snapshot.data as bool, 93 | _whatsappStickersHandler, 94 | ); 95 | }), 96 | ), 97 | ), 98 | ); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /lib/constants/constants.dart: -------------------------------------------------------------------------------- 1 | const String BASE_URL = "https://mandj.sfo2.cdn.digitaloceanspaces.com/stickers_test/"; 2 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:trendy_whatsapp_stickers/screens/information_screen.dart'; 3 | import 'package:trendy_whatsapp_stickers/screens/sticker_pack_info.dart'; 4 | import 'package:trendy_whatsapp_stickers/screens/stickers_screen.dart'; 5 | 6 | enum PopupMenuOptions { 7 | staticStickers, 8 | remoteStickers, 9 | informations, 10 | } 11 | 12 | void main() { 13 | runApp(const MyApp()); 14 | } 15 | 16 | class MyApp extends StatefulWidget { 17 | const MyApp({Key? key}) : super(key: key); 18 | 19 | @override 20 | State createState() => _MyAppState(); 21 | } 22 | 23 | class _MyAppState extends State { 24 | @override 25 | Widget build(BuildContext context) { 26 | return MaterialApp( 27 | title: "Trendy WhatsApp Stickers", 28 | initialRoute: StickersScreen.routeName, 29 | theme: ThemeData( 30 | primarySwatch: Colors.teal, 31 | ), 32 | debugShowCheckedModeBanner: false, 33 | routes: { 34 | StickersScreen.routeName: (ctx) => const StickersScreen(), 35 | StickerPackInfoScreen.routeName: (ctx) => const StickerPackInfoScreen(), 36 | InformationScreen.routeName: (ctx) => const InformationScreen() 37 | }, 38 | ); 39 | } 40 | } -------------------------------------------------------------------------------- /lib/models/sticker_data.dart: -------------------------------------------------------------------------------- 1 | class StickerData { 2 | String? androidPlayStoreLink; 3 | String? iosAppStoreLink; 4 | List? stickerPacks; 5 | 6 | StickerData( 7 | {this.androidPlayStoreLink, this.iosAppStoreLink, this.stickerPacks}); 8 | 9 | StickerData.fromJson(Map json) { 10 | androidPlayStoreLink = json['android_play_store_link']; 11 | iosAppStoreLink = json['ios_app_store_link']; 12 | if (json['sticker_packs'] != null) { 13 | stickerPacks = []; 14 | json['sticker_packs'].forEach((v) { 15 | stickerPacks!.add(StickerPacks.fromJson(v)); 16 | }); 17 | } 18 | } 19 | 20 | Map toJson() { 21 | final Map data = Map(); 22 | data['android_play_store_link'] = androidPlayStoreLink; 23 | data['ios_app_store_link'] = iosAppStoreLink; 24 | if (stickerPacks != null) { 25 | data['sticker_packs'] = stickerPacks!.map((v) => v.toJson()).toList(); 26 | } 27 | return data; 28 | } 29 | 30 | @override 31 | String toString() { 32 | return "androidPlayStoreLink: $androidPlayStoreLink, iosAppStoreLink: $iosAppStoreLink"; 33 | } 34 | } 35 | 36 | class StickerPacks { 37 | String? identifier; 38 | String? name; 39 | String? publisher; 40 | String? trayImageFile; 41 | String? imageDataVersion; 42 | bool? avoidCache; 43 | String? publisherEmail; 44 | String? publisherWebsite; 45 | String? privacyPolicyWebsite; 46 | String? licenseAgreementWebsite; 47 | List? stickers; 48 | bool? animatedStickerPack; 49 | bool isInstalled = false; 50 | 51 | StickerPacks( 52 | {this.identifier, 53 | this.name, 54 | this.publisher, 55 | this.trayImageFile, 56 | this.imageDataVersion, 57 | this.avoidCache, 58 | this.publisherEmail, 59 | this.publisherWebsite, 60 | this.privacyPolicyWebsite, 61 | this.licenseAgreementWebsite, 62 | this.stickers, 63 | this.animatedStickerPack}); 64 | 65 | StickerPacks.fromJson(Map json) { 66 | identifier = json['identifier']; 67 | name = json['name']; 68 | publisher = json['publisher']; 69 | trayImageFile = json['tray_image_file']; 70 | imageDataVersion = json['image_data_version']; 71 | avoidCache = json['avoid_cache']; 72 | publisherEmail = json['publisher_email']; 73 | publisherWebsite = json['publisher_website']; 74 | privacyPolicyWebsite = json['privacy_policy_website']; 75 | licenseAgreementWebsite = json['license_agreement_website']; 76 | if (json['stickers'] != null) { 77 | stickers = []; 78 | json['stickers'].forEach((v) { 79 | stickers!.add(Stickers.fromJson(v)); 80 | }); 81 | } 82 | animatedStickerPack = json['animated_sticker_pack']; 83 | } 84 | 85 | Map toJson() { 86 | final Map data = {}; 87 | data['identifier'] = identifier; 88 | data['name'] = name; 89 | data['publisher'] = publisher; 90 | data['tray_image_file'] = trayImageFile; 91 | data['image_data_version'] = imageDataVersion; 92 | data['avoid_cache'] = avoidCache; 93 | data['publisher_email'] = publisherEmail; 94 | data['publisher_website'] = publisherWebsite; 95 | data['privacy_policy_website'] = privacyPolicyWebsite; 96 | data['license_agreement_website'] = licenseAgreementWebsite; 97 | if (stickers != null) { 98 | data['stickers'] = stickers!.map((v) => v.toJson()).toList(); 99 | } 100 | data['animated_sticker_pack'] = animatedStickerPack; 101 | return data; 102 | } 103 | 104 | @override 105 | String toString() { 106 | // TODO: implement toString 107 | return "identifier: $identifier, name: $name, publisher: $publisher"; 108 | } 109 | } 110 | 111 | class Stickers { 112 | String? imageFile; 113 | List? emojis; 114 | 115 | Stickers({this.imageFile, this.emojis}); 116 | 117 | Stickers.fromJson(Map json) { 118 | imageFile = json['image_file']; 119 | emojis = json['emojis'].cast(); 120 | } 121 | 122 | Map toJson() { 123 | final Map data = {}; 124 | data['image_file'] = imageFile; 125 | data['emojis'] = emojis; 126 | return data; 127 | } 128 | } -------------------------------------------------------------------------------- /lib/screens/information_screen.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter/services.dart'; 4 | import 'package:whatsapp_stickers_handler/whatsapp_stickers_handler.dart'; 5 | 6 | class InformationScreen extends StatefulWidget { 7 | static const routeName = 'information'; 8 | 9 | const InformationScreen({Key? key}) : super(key: key); 10 | 11 | @override 12 | State createState() => _InformationScreenState(); 13 | } 14 | 15 | class _InformationScreenState extends State { 16 | String _platformVersion = 'Unknown'; 17 | bool _whatsAppInstalled = false; 18 | bool _whatsAppConsumerAppInstalled = false; 19 | bool _whatsAppSmbAppInstalled = false; 20 | 21 | @override 22 | void initState() { 23 | super.initState(); 24 | init(); 25 | } 26 | 27 | Future init() async { 28 | String platformVersion; 29 | 30 | // Platform messages may fail, so we use a try/catch PlatformException. 31 | try { 32 | platformVersion = (await WhatsappStickersHandler.platformVersion)!; 33 | } on PlatformException { 34 | platformVersion = 'Failed to get platform version.'; 35 | } 36 | 37 | // If the widget was removed from the tree while the asynchronous platform 38 | // message was in flight, we want to discard the reply rather than calling 39 | // setState to update our non-existent appearance. 40 | if (!mounted) return; 41 | 42 | bool whatsAppInstalled = await WhatsappStickersHandler.isWhatsAppInstalled; 43 | bool whatsAppConsumerAppInstalled = 44 | await WhatsappStickersHandler.isWhatsAppConsumerAppInstalled; 45 | bool whatsAppSmbAppInstalled = 46 | await WhatsappStickersHandler.isWhatsAppSmbAppInstalled; 47 | 48 | setState(() { 49 | _platformVersion = platformVersion; 50 | _whatsAppInstalled = whatsAppInstalled; 51 | _whatsAppConsumerAppInstalled = whatsAppConsumerAppInstalled; 52 | _whatsAppSmbAppInstalled = whatsAppSmbAppInstalled; 53 | }); 54 | } 55 | 56 | @override 57 | Widget build(BuildContext context) { 58 | return Scaffold( 59 | appBar: AppBar(title: const Text("Informations")), 60 | body: Center( 61 | child: Column( 62 | mainAxisAlignment: MainAxisAlignment.start, 63 | crossAxisAlignment: CrossAxisAlignment.center, 64 | children: [ 65 | const SizedBox(height: 100), 66 | Text('Running on: $_platformVersion'), 67 | const SizedBox(height: 10), 68 | Text("WhatsApp Installed: $_whatsAppInstalled"), 69 | const SizedBox(height: 10), 70 | Text("WhatsApp Consumer Installed: $_whatsAppConsumerAppInstalled"), 71 | const SizedBox(height: 10), 72 | Text("WhatsApp Business Installed: $_whatsAppSmbAppInstalled"), 73 | const SizedBox(height: 10), 74 | TextButton( 75 | onPressed: () { 76 | WhatsappStickersHandler.launchWhatsApp(); 77 | }, 78 | child: const Text("Open WhatsApp")) 79 | ], 80 | ), 81 | ), 82 | ); 83 | } 84 | } -------------------------------------------------------------------------------- /lib/screens/sticker_pack_info.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:trendy_whatsapp_stickers/Widgets/Drawer.dart'; 5 | import 'package:trendy_whatsapp_stickers/constants/constants.dart'; 6 | import 'package:whatsapp_stickers_handler/exceptions.dart'; 7 | import 'package:whatsapp_stickers_handler/whatsapp_stickers_handler.dart'; 8 | import 'package:path_provider/path_provider.dart'; 9 | import 'package:dio/dio.dart'; 10 | import 'package:trendy_whatsapp_stickers/models/sticker_data.dart'; 11 | 12 | class StickerPackInfoScreen extends StatefulWidget { 13 | static const routeName = '/sticker-pack-info'; 14 | 15 | const StickerPackInfoScreen({Key? key}) : super(key: key); 16 | 17 | @override 18 | State createState() => _StickerPackInfoScreenState(); 19 | } 20 | 21 | class _StickerPackInfoScreenState extends State { 22 | Future addStickerPack() async {} 23 | 24 | @override 25 | Widget build(BuildContext context) { 26 | final arguments = ModalRoute.of(context)?.settings.arguments as Map; 27 | 28 | final StickerPacks stickerPack = arguments['stickerPack'] as StickerPacks; 29 | final String stickerFetchType = arguments['stickerFetchType'] as String; 30 | 31 | List fakeBottomButtons = []; 32 | fakeBottomButtons.add( 33 | Container( 34 | height: 50.0, 35 | ), 36 | ); 37 | Widget depInstallWidget; 38 | if (stickerPack.isInstalled) { 39 | depInstallWidget = const Padding( 40 | padding: EdgeInsets.symmetric(vertical: 8.0), 41 | child: Text( 42 | "Sticker Added", 43 | style: TextStyle( 44 | color: Colors.green, fontSize: 16.0, fontWeight: FontWeight.bold), 45 | ), 46 | ); 47 | } else { 48 | depInstallWidget = ElevatedButton( 49 | child: const Text("Add Sticker"), 50 | onPressed: () async { 51 | Map> stickers = >{}; 52 | var tryImage = ''; 53 | if (stickerFetchType == 'staticStickers') { 54 | for (var e in stickerPack.stickers!) { 55 | stickers[WhatsappStickerImageHandler.fromAsset( 56 | "sticker_packs/${stickerPack.identifier}/${e.imageFile as String}") 57 | .path] = e.emojis as List; 58 | } 59 | tryImage = WhatsappStickerImageHandler.fromAsset( 60 | "sticker_packs/${stickerPack.identifier}/${stickerPack.trayImageFile}") 61 | .path; 62 | } else { 63 | final dio = Dio(); 64 | final downloads = []; 65 | var applicationDocumentsDirectory = 66 | await getApplicationDocumentsDirectory(); 67 | var stickersDirectory = Directory( 68 | //'${applicationDocumentsDirectory.path}/stickers/${stickerPack.identifier}'); 69 | '${applicationDocumentsDirectory.path}/${stickerPack.identifier}'); 70 | await stickersDirectory.create(recursive: true); 71 | 72 | downloads.add( 73 | dio.download( 74 | "${BASE_URL}${stickerPack.identifier}/${stickerPack.trayImageFile}", 75 | "${stickersDirectory.path}/${stickerPack.trayImageFile!.toLowerCase()}", 76 | ), 77 | ); 78 | tryImage = WhatsappStickerImageHandler.fromFile( 79 | "${stickersDirectory.path}/${stickerPack.trayImageFile!.toLowerCase()}") 80 | .path; 81 | 82 | for (var e in stickerPack.stickers!) { 83 | var urlPath = 84 | "${BASE_URL}${stickerPack.identifier}/${(e.imageFile as String)}"; 85 | var savePath = 86 | "${stickersDirectory.path}/${(e.imageFile as String).toLowerCase()}"; 87 | downloads.add( 88 | dio.download( 89 | urlPath, 90 | savePath, 91 | ), 92 | ); 93 | 94 | stickers[WhatsappStickerImageHandler.fromFile( 95 | "${stickersDirectory.path}/${(e.imageFile as String).toLowerCase()}") 96 | .path] = e.emojis as List; 97 | } 98 | 99 | await Future.wait(downloads); 100 | } 101 | 102 | try { 103 | final WhatsappStickersHandler _whatsappStickersHandler = 104 | WhatsappStickersHandler(); 105 | var result = await _whatsappStickersHandler.addStickerPack( 106 | stickerPack.identifier, 107 | stickerPack.name as String, 108 | stickerPack.publisher as String, 109 | tryImage, 110 | stickerPack.publisherWebsite, 111 | stickerPack.privacyPolicyWebsite, 112 | stickerPack.licenseAgreementWebsite, 113 | stickerPack.animatedStickerPack ?? false, 114 | stickers, 115 | ); 116 | print("RESULT $result"); 117 | } on WhatsappStickersException catch (e) { 118 | print("INSIDE WhatsappStickersException ${e.cause}"); 119 | var exceptionMessage = e.cause; 120 | ScaffoldMessenger.of(context).showSnackBar( 121 | SnackBar(content: Text(exceptionMessage.toString()) 122 | )); 123 | } catch (e) { 124 | print("Exception ${e.toString()}"); 125 | } 126 | }, 127 | ); 128 | } 129 | 130 | return Scaffold( 131 | appBar: AppBar( 132 | title: Text(stickerPack.name.toString() + " Stickers"), 133 | ), 134 | drawer: Drawer( 135 | child: MyDrawer(), 136 | ), 137 | body: Column( 138 | children: [ 139 | Container( 140 | padding: EdgeInsets.all(5), 141 | decoration: BoxDecoration( 142 | color: Colors.white, 143 | ), 144 | child: Row( 145 | crossAxisAlignment: CrossAxisAlignment.center, 146 | mainAxisAlignment: MainAxisAlignment.start, 147 | children: [ 148 | TextButton( 149 | child: Icon( 150 | Icons.arrow_back, 151 | color: Colors.black, 152 | ), 153 | onPressed: () { 154 | Navigator.pop(context); 155 | }, 156 | ), 157 | Text( 158 | "All Stickers", 159 | style: const TextStyle( 160 | fontSize: 20.0, 161 | fontWeight: FontWeight.bold, 162 | color: Colors.black, 163 | ), 164 | ), 165 | ], 166 | ), 167 | ), 168 | Row( 169 | crossAxisAlignment: CrossAxisAlignment.start, 170 | children: [ 171 | Padding( 172 | padding: const EdgeInsets.all(10.0), 173 | child: stickerFetchType == "remoteStickers" 174 | ? FadeInImage( 175 | placeholder: 176 | const AssetImage("assets/images/loading.gif"), 177 | image: NetworkImage( 178 | "${BASE_URL}/${stickerPack.identifier}/${stickerPack.trayImageFile}"), 179 | height: 100, 180 | width: 100, 181 | ) 182 | : Image.asset( 183 | "sticker_packs/${stickerPack.identifier}/${stickerPack.trayImageFile}", 184 | width: 100, 185 | height: 100, 186 | ), 187 | ), 188 | Padding( 189 | padding: const EdgeInsets.symmetric( 190 | vertical: 20.0, horizontal: 20.0), 191 | child: Column( 192 | crossAxisAlignment: CrossAxisAlignment.start, 193 | children: [ 194 | Text( 195 | stickerPack.name as String, 196 | style: const TextStyle( 197 | fontSize: 20.0, 198 | fontWeight: FontWeight.bold, 199 | color: Colors.blue, 200 | ), 201 | ), 202 | Text( 203 | stickerPack.publisher as String, 204 | style: const TextStyle( 205 | fontSize: 14.0, 206 | color: Colors.black54, 207 | ), 208 | ), 209 | depInstallWidget, 210 | ], 211 | ), 212 | ) 213 | ], 214 | ), 215 | Expanded( 216 | child: GridView.builder( 217 | gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( 218 | crossAxisCount: 4, 219 | childAspectRatio: 1, 220 | ), 221 | itemCount: stickerPack.stickers!.length, 222 | itemBuilder: (context, index) { 223 | return Padding( 224 | padding: const EdgeInsets.all(15.0), 225 | child: stickerFetchType == "remoteStickers" 226 | ? FadeInImage( 227 | placeholder: 228 | const AssetImage("assets/images/loading.gif"), 229 | image: NetworkImage( 230 | "${BASE_URL}${stickerPack.identifier}/${stickerPack.stickers![index].imageFile as String}"), 231 | ) 232 | : Image.asset( 233 | "sticker_packs/${stickerPack.identifier}/${stickerPack.stickers![index].imageFile as String}"), 234 | ); 235 | }, 236 | ), 237 | ) 238 | ], 239 | ), 240 | persistentFooterButtons: fakeBottomButtons, 241 | ); 242 | } 243 | } 244 | -------------------------------------------------------------------------------- /lib/screens/stickers_screen.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:flutter/services.dart'; 4 | import 'package:trendy_whatsapp_stickers/Widgets/Drawer.dart'; 5 | import 'package:trendy_whatsapp_stickers/constants/constants.dart'; 6 | import 'package:trendy_whatsapp_stickers/models/sticker_data.dart'; 7 | import 'package:dio/dio.dart'; 8 | import 'package:trendy_whatsapp_stickers/widgets/sticker_pack_item.dart'; 9 | 10 | class StickersScreen extends StatefulWidget { 11 | static const routeName = '/'; 12 | 13 | const StickersScreen({Key? key}) : super(key: key); 14 | 15 | @override 16 | State createState() => _StickersScreenState(); 17 | } 18 | 19 | class _StickersScreenState extends State { 20 | bool _isLoading = false; 21 | 22 | late StickerData stickerData; 23 | 24 | List stickerPacks = []; 25 | List installedStickerPacks = []; 26 | late String stickerFetchType; 27 | late Dio dio; 28 | var downloads = []; 29 | var data; 30 | 31 | void _loadStickers() async { 32 | if (stickerFetchType == 'staticStickers') { 33 | data = await rootBundle.loadString("sticker_packs/sticker_packs.json"); 34 | } else { 35 | dio = Dio(); 36 | data = await dio.get("${BASE_URL}contents.json"); 37 | } 38 | setState(() { 39 | stickerData = StickerData.fromJson(jsonDecode(data.toString())); 40 | _isLoading = false; 41 | }); 42 | } 43 | 44 | @override 45 | didChangeDependencies() { 46 | var args = ModalRoute.of(context)?.settings.arguments as String?; 47 | stickerFetchType = args ?? "staticStickers"; 48 | setState(() { 49 | _isLoading = true; 50 | }); 51 | _loadStickers(); 52 | super.didChangeDependencies(); 53 | } 54 | 55 | Widget build(BuildContext context) { 56 | return Scaffold( 57 | appBar: AppBar( 58 | title: Text("Trendy WhatsApp Stickers"), 59 | ), 60 | drawer: Drawer( 61 | child: MyDrawer(), 62 | ), 63 | body: _isLoading 64 | ? const Center(child: CircularProgressIndicator()) 65 | : ListView.builder( 66 | itemCount: stickerData.stickerPacks!.length, 67 | itemBuilder: (context, index) { 68 | return StickerPackItem( 69 | stickerPack: stickerData.stickerPacks![index], 70 | stickerFetchType: stickerFetchType, 71 | ); 72 | }, 73 | ), 74 | ); 75 | } 76 | } -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/.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: c860cba910319332564e1e9d470a17074c1f2dfd 8 | channel: stable 9 | 10 | project_type: plugin 11 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.0.1 2 | 3 | * TODO: Describe initial release. 4 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/LICENSE: -------------------------------------------------------------------------------- 1 | TODO: Add your license here. 2 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/README.md: -------------------------------------------------------------------------------- 1 | # whatsapp_stickers_handler 2 | 3 | A new flutter plugin project. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter 8 | [plug-in package](https://flutter.dev/developing-packages/), 9 | a specialized package that includes platform-specific implementation code for 10 | Android and/or iOS. 11 | 12 | For help getting started with Flutter, view our 13 | [online documentation](https://flutter.dev/docs), which offers tutorials, 14 | samples, guidance on mobile development, and a full API reference. 15 | 16 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | 3 | # Additional information about this file can be found at 4 | # https://dart.dev/guides/language/analysis-options 5 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/build.gradle: -------------------------------------------------------------------------------- 1 | group 'com.indiagenisys.whatsapp_stickers_handler' 2 | version '1.0-SNAPSHOT' 3 | 4 | buildscript { 5 | ext.kotlin_version = '1.6.10' 6 | repositories { 7 | google() 8 | mavenCentral() 9 | } 10 | 11 | dependencies { 12 | classpath 'com.android.tools.build:gradle:4.1.0' 13 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 14 | } 15 | } 16 | 17 | rootProject.allprojects { 18 | repositories { 19 | google() 20 | mavenCentral() 21 | } 22 | } 23 | 24 | apply plugin: 'com.android.library' 25 | apply plugin: 'kotlin-android' 26 | 27 | android { 28 | compileSdkVersion 31 29 | 30 | compileOptions { 31 | sourceCompatibility JavaVersion.VERSION_1_8 32 | targetCompatibility JavaVersion.VERSION_1_8 33 | } 34 | 35 | kotlinOptions { 36 | jvmTarget = '1.8' 37 | } 38 | 39 | sourceSets { 40 | main.java.srcDirs += 'src/main/kotlin' 41 | } 42 | 43 | defaultConfig { 44 | minSdkVersion 16 45 | } 46 | } 47 | 48 | dependencies { 49 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 50 | } 51 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'whatsapp_stickers_handler' 2 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/src/main/kotlin/com/indiagenisys/whatsapp_stickers_handler/ConfigFileManager.java: -------------------------------------------------------------------------------- 1 | package com.indiagenisys.whatsapp_stickers_handler; 2 | 3 | import android.content.Context; 4 | import android.util.Log; 5 | 6 | import androidx.annotation.NonNull; 7 | 8 | import org.json.JSONArray; 9 | import org.json.JSONException; 10 | import org.json.JSONObject; 11 | 12 | import java.io.BufferedReader; 13 | import java.io.File; 14 | import java.io.FileInputStream; 15 | import java.io.FileReader; 16 | import java.io.FileWriter; 17 | import java.io.IOException; 18 | import java.io.InputStream; 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | import java.util.Locale; 22 | import java.util.Map; 23 | 24 | import io.flutter.plugin.common.MethodCall; 25 | import io.flutter.util.PathUtils; 26 | 27 | public class ConfigFileManager { 28 | 29 | public static final String CONTENT_FILE_NAME = "sticker_packs.json"; 30 | 31 | static List getStickerPacks(Context context) { 32 | List stickerPackList; 33 | File file = new File(getConfigFilePath(context)); 34 | if (!file.exists()) { 35 | return new ArrayList(); 36 | } 37 | try (InputStream contentsInputStream = new FileInputStream(file)) { 38 | stickerPackList = ContentFileParser.parseStickerPacks(contentsInputStream); 39 | } catch (IOException | IllegalStateException e) { 40 | throw new RuntimeException("config file has some issues: " + e.getMessage(), e); 41 | } 42 | return stickerPackList; 43 | } 44 | 45 | 46 | 47 | static StickerPack fromMethodCall(Context context, MethodCall call) { 48 | String identifier = call.argument("identifier"); 49 | String name = call.argument("name"); 50 | String publisher = call.argument("publisher"); 51 | String trayImageFileName = call.argument("trayImageFileName"); 52 | trayImageFileName = getFileName(trayImageFileName); 53 | String publisherWebsite = call.argument("publisherWebsite"); 54 | String privacyPolicyWebsite = call.argument("privacyPolicyWebsite"); 55 | String licenseAgreementWebsite = call.argument("licenseAgreementWebsite"); 56 | boolean animatedStickerPack = call.argument("animatedStickerPack"); 57 | Map> stickers = call.argument("stickers"); 58 | 59 | StickerPack newStickerPack = new StickerPack(identifier, name, publisher, trayImageFileName, "", publisherWebsite, privacyPolicyWebsite, licenseAgreementWebsite, "1", false, animatedStickerPack); 60 | List newStickers = new ArrayList(); 61 | assert stickers != null; 62 | for (Map.Entry> entry : stickers.entrySet()) { 63 | Sticker s = new Sticker(getFileName(entry.getKey()), entry.getValue()); 64 | newStickers.add(s); 65 | } 66 | newStickerPack.setStickers(newStickers); 67 | newStickerPack.setAndroidPlayStoreLink(""); 68 | newStickerPack.setIosAppStoreLink(""); 69 | return newStickerPack; 70 | } 71 | static String getWhatsappType(MethodCall call) { 72 | String whatsappType = call.argument("whatsappType"); 73 | return whatsappType; 74 | } 75 | 76 | static boolean addNewPack(Context context, StickerPack stickerPack) throws JSONException, InvalidPackException { 77 | //Log.e("WaStickerLog", "stickerPack on add/update " + stickerPack.toString()); 78 | List stickerPacks = new ArrayList(); 79 | boolean isInstalled = false; 80 | int imageDataVersion = 1; 81 | for (StickerPack s : getStickerPacks(context)) { 82 | if (!s.identifier.equals(stickerPack.identifier)) { 83 | stickerPacks.add(s); 84 | } else { 85 | isInstalled = true; 86 | imageDataVersion = (Integer.parseInt(s.imageDataVersion) + 1); 87 | for (int i = 0; i < s.getStickers().size(); i++) { 88 | Sticker sticker = s.getStickers().get(i); 89 | if (!stickerPack.getStickers().contains(sticker)) { 90 | String fname = sticker.imageFileName.replace("._.", File.separator); 91 | //Log.e("WaStickerLog", "Sticker exist => " + new File(fname).exists()); 92 | try { 93 | new File(fname).delete(); 94 | //Log.e("WaStickerLog", "Sticker Removed => " + new File(fname).exists()); 95 | } catch (Exception e) { 96 | e.printStackTrace(); 97 | } 98 | } else { 99 | //Log.e("WaStickerLog", "Sticker Not Removed => " + sticker.imageFileName); 100 | } 101 | } 102 | } 103 | } 104 | if (isInstalled) { 105 | stickerPack.imageDataVersion = imageDataVersion + ""; 106 | } 107 | stickerPacks.add(stickerPack); 108 | return updateConfigFile(context, stickerPacks); 109 | } 110 | 111 | static String getFileName(String name) { 112 | if (name.contains("assets://")) { 113 | name = name.replace("assets://", ""); 114 | name = name.replace("/", "_SSP_"); 115 | } else if (name.contains("file://")) { 116 | name = name.replace("file://", ""); 117 | name = name.replace("/", "._."); 118 | } 119 | return name; 120 | } 121 | 122 | static boolean updateConfigFile(Context context, List stickerPacks) throws JSONException, InvalidPackException { 123 | JSONObject mObj = new JSONObject(); 124 | if (stickerPacks.size() <= 0) { 125 | mObj.put("android_play_store_link", ""); 126 | mObj.put("ios_app_store_link", ""); 127 | } else { 128 | mObj.put("android_play_store_link", stickerPacks.get(0).androidPlayStoreLink); 129 | mObj.put("ios_app_store_link", stickerPacks.get(0).iosAppStoreLink); 130 | } 131 | JSONArray _packs = new JSONArray(); 132 | for (StickerPack s : stickerPacks) { 133 | JSONObject obj = new JSONObject(); 134 | obj.put("identifier", s.identifier); 135 | obj.put("name", s.name); 136 | obj.put("publisher", s.publisher); 137 | obj.put("tray_image_file", getFileName(s.trayImageFile)); 138 | obj.put("image_data_version", s.imageDataVersion); 139 | obj.put("avoid_cache", s.avoidCache); 140 | obj.put("animated_sticker_pack", s.animatedStickerPack); 141 | obj.put("publisher_email", s.publisherEmail); 142 | obj.put("publisher_website", s.publisherWebsite); 143 | obj.put("privacy_policy_website", s.privacyPolicyWebsite); 144 | obj.put("license_agreement_website", s.licenseAgreementWebsite); 145 | 146 | JSONArray stickerList = new JSONArray(); 147 | for (Sticker _sticker : s.getStickers()) { 148 | JSONObject stickerObj = new JSONObject(); 149 | String stickerFileName = getFileName(_sticker.imageFileName); 150 | stickerObj.put("image_file", stickerFileName); 151 | JSONArray _emojies = new JSONArray(); 152 | for (String emoji : _sticker.emojis) { 153 | _emojies.put(emoji); 154 | } 155 | stickerObj.put("emojis", _emojies); 156 | stickerList.put(stickerObj); 157 | } 158 | obj.put("stickers", stickerList); 159 | _packs.put(obj); 160 | } 161 | mObj.put("sticker_packs", _packs); 162 | writeConfigFile(context, mObj.toString()); 163 | return true; 164 | } 165 | 166 | static void writeConfigFile(Context context, String jsonString) { 167 | String filePath = getConfigFilePath(context); 168 | File f = new File(filePath); 169 | try { 170 | FileWriter writer = new FileWriter(f); 171 | writer.write(jsonString); 172 | // Log.d("WaStickerLog", "StickerData WriteToConfig : " + jsonString); 173 | writer.close(); 174 | } catch (IOException e) { 175 | e.printStackTrace(); 176 | } 177 | } 178 | 179 | static void generateConfigFile(Context context) throws JSONException { 180 | File file = new File(getConfigFilePath(context)); 181 | if (!file.exists()) { 182 | //prepare data 183 | JSONObject mObj = new JSONObject(); 184 | mObj.put("android_play_store_link", ""); 185 | mObj.put("ios_app_store_link", ""); 186 | JSONArray _packs = new JSONArray(); 187 | mObj.put("sticker_packs", _packs); 188 | // write in file 189 | writeConfigFile(context, mObj.toString()); 190 | } 191 | } 192 | 193 | public static String readConfigFile(Context context) { 194 | File file = new File(getConfigFilePath(context)); 195 | StringBuilder text = new StringBuilder(); 196 | try { 197 | BufferedReader br = new BufferedReader(new FileReader(file)); 198 | String line; 199 | while ((line = br.readLine()) != null) { 200 | text.append(line); 201 | text.append('\n'); 202 | } 203 | br.close(); 204 | } catch (IOException e) { 205 | e.printStackTrace(); 206 | } 207 | return text.toString(); 208 | } 209 | 210 | public static String getConfigFilePath(Context context) { 211 | return PathUtils.getDataDirectory(context) + File.separator + CONTENT_FILE_NAME; 212 | } 213 | } 214 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/src/main/kotlin/com/indiagenisys/whatsapp_stickers_handler/ContentFileParser.java: -------------------------------------------------------------------------------- 1 | 2 | package com.indiagenisys.whatsapp_stickers_handler; 3 | 4 | import android.text.TextUtils; 5 | import android.util.JsonReader; 6 | import android.util.Log; 7 | 8 | import androidx.annotation.NonNull; 9 | 10 | import java.io.IOException; 11 | import java.io.InputStream; 12 | import java.io.InputStreamReader; 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | class ContentFileParser { 17 | 18 | private static final int LIMIT_EMOJI_COUNT = 3; 19 | 20 | @NonNull 21 | static List parseStickerPacks(@NonNull InputStream contentsInputStream) throws IOException, IllegalStateException { 22 | try (JsonReader reader = new JsonReader(new InputStreamReader(contentsInputStream))) { 23 | return readStickerPacks(reader); 24 | } 25 | } 26 | 27 | @NonNull 28 | private static List readStickerPacks(@NonNull JsonReader reader) throws IOException, IllegalStateException { 29 | List stickerPackList = new ArrayList<>(); 30 | String androidPlayStoreLink = null; 31 | String iosAppStoreLink = null; 32 | reader.beginObject(); 33 | while (reader.hasNext()) { 34 | String key = reader.nextName(); 35 | if ("android_play_store_link".equals(key)) { 36 | androidPlayStoreLink = reader.nextString(); 37 | } else if ("ios_app_store_link".equals(key)) { 38 | iosAppStoreLink = reader.nextString(); 39 | } else if ("sticker_packs".equals(key)) { 40 | reader.beginArray(); 41 | while (reader.hasNext()) { 42 | StickerPack stickerPack = readStickerPack(reader); 43 | stickerPackList.add(stickerPack); 44 | } 45 | reader.endArray(); 46 | } else { 47 | throw new IllegalStateException("unknown field in json: " + key); 48 | } 49 | } 50 | reader.endObject(); 51 | for (StickerPack stickerPack : stickerPackList) { 52 | stickerPack.setAndroidPlayStoreLink(androidPlayStoreLink); 53 | stickerPack.setIosAppStoreLink(iosAppStoreLink); 54 | } 55 | //Log.e("StickerPackList", "READ => " + stickerPackList.toString()); 56 | return stickerPackList; 57 | } 58 | 59 | @NonNull 60 | private static StickerPack readStickerPack(@NonNull JsonReader reader) throws IOException, IllegalStateException { 61 | reader.beginObject(); 62 | String identifier = null; 63 | String name = null; 64 | String publisher = null; 65 | String trayImageFile = null; 66 | String publisherEmail = null; 67 | String publisherWebsite = null; 68 | String privacyPolicyWebsite = null; 69 | String licenseAgreementWebsite = null; 70 | String imageDataVersion = ""; 71 | boolean avoidCache = false; 72 | boolean animatedStickerPack = false; 73 | List stickerList = null; 74 | while (reader.hasNext()) { 75 | String key = reader.nextName(); 76 | switch (key) { 77 | case "identifier": 78 | identifier = reader.nextString(); 79 | break; 80 | case "name": 81 | name = reader.nextString(); 82 | break; 83 | case "publisher": 84 | publisher = reader.nextString(); 85 | break; 86 | case "tray_image_file": 87 | trayImageFile = reader.nextString(); 88 | break; 89 | case "publisher_email": 90 | publisherEmail = reader.nextString(); 91 | break; 92 | case "publisher_website": 93 | publisherWebsite = reader.nextString(); 94 | break; 95 | case "privacy_policy_website": 96 | privacyPolicyWebsite = reader.nextString(); 97 | break; 98 | case "license_agreement_website": 99 | licenseAgreementWebsite = reader.nextString(); 100 | break; 101 | case "stickers": 102 | stickerList = readStickers(reader); 103 | break; 104 | case "image_data_version": 105 | imageDataVersion = reader.nextString(); 106 | break; 107 | case "avoid_cache": 108 | avoidCache = reader.nextBoolean(); 109 | break; 110 | case "animated_sticker_pack": 111 | animatedStickerPack = reader.nextBoolean(); 112 | break; 113 | default: 114 | reader.skipValue(); 115 | } 116 | } 117 | if (TextUtils.isEmpty(identifier)) { 118 | throw new IllegalStateException("identifier cannot be empty"); 119 | } 120 | if (TextUtils.isEmpty(name)) { 121 | throw new IllegalStateException("name cannot be empty"); 122 | } 123 | if (TextUtils.isEmpty(publisher)) { 124 | throw new IllegalStateException("publisher cannot be empty"); 125 | } 126 | if (TextUtils.isEmpty(trayImageFile)) { 127 | throw new IllegalStateException("tray_image_file cannot be empty"); 128 | } 129 | if (stickerList == null || stickerList.size() == 0) { 130 | throw new IllegalStateException("sticker list is empty"); 131 | } 132 | if (identifier.contains("..") || identifier.contains("/")) { 133 | throw new IllegalStateException("identifier should not contain .. or / to prevent directory traversal"); 134 | } 135 | if (TextUtils.isEmpty(imageDataVersion)) { 136 | throw new IllegalStateException("image_data_version should not be empty"); 137 | } 138 | reader.endObject(); 139 | final StickerPack stickerPack = new StickerPack(identifier, name, publisher, trayImageFile, publisherEmail, publisherWebsite, privacyPolicyWebsite, licenseAgreementWebsite, imageDataVersion, avoidCache, animatedStickerPack); 140 | stickerPack.setStickers(stickerList); 141 | return stickerPack; 142 | } 143 | 144 | @NonNull 145 | private static List readStickers(@NonNull JsonReader reader) throws IOException, IllegalStateException { 146 | reader.beginArray(); 147 | List stickerList = new ArrayList<>(); 148 | 149 | while (reader.hasNext()) { 150 | reader.beginObject(); 151 | String imageFile = null; 152 | List emojis = new ArrayList<>(LIMIT_EMOJI_COUNT); 153 | while (reader.hasNext()) { 154 | final String key = reader.nextName(); 155 | if ("image_file".equals(key)) { 156 | imageFile = reader.nextString(); 157 | } else if ("emojis".equals(key)) { 158 | reader.beginArray(); 159 | while (reader.hasNext()) { 160 | String emoji = reader.nextString(); 161 | emojis.add(emoji); 162 | } 163 | reader.endArray(); 164 | } else { 165 | throw new IllegalStateException("unknown field in json: " + key); 166 | } 167 | } 168 | reader.endObject(); 169 | if (TextUtils.isEmpty(imageFile)) { 170 | throw new IllegalStateException("sticker image_file cannot be empty"); 171 | } 172 | if (!imageFile.endsWith(".webp")) { 173 | throw new IllegalStateException("image file for stickers should be webp files, image file is: " + imageFile); 174 | } 175 | stickerList.add(new Sticker(imageFile, emojis)); 176 | } 177 | reader.endArray(); 178 | return stickerList; 179 | } 180 | } -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/src/main/kotlin/com/indiagenisys/whatsapp_stickers_handler/InvalidPackException.java: -------------------------------------------------------------------------------- 1 | package com.indiagenisys.whatsapp_stickers_handler; 2 | 3 | public class InvalidPackException extends Exception { 4 | 5 | public static String FILE_NOT_FOUND = "FILE_NOT_FOUND"; 6 | public static String OUTSIDE_ALLOWABLE_RANGE = "OUTSIDE_ALLOWABLE_RANGE"; 7 | public static String UNSUPPORTED_IMAGE_FORMAT = "UNSUPPORTED_IMAGE_FORMAT"; 8 | public static String IMAGE_TOO_BIG = "IMAGE_TOO_BIG"; 9 | public static String INCORRECT_IMAGE_SIZE = "INCORRECT_IMAGE_SIZE"; 10 | public static String ANIMATED_IMAGES_NOT_SUPPORTED = "ANIMATED_IMAGES_NOT_SUPPORTED"; 11 | public static String TOO_MANY_EMOJIS = "TOO_MANY_EMOJIS"; 12 | public static String EMPTY_STRING = "EMPTY_STRING"; 13 | public static String STRING_TOO_LONG = "STRING_TOO_LONG"; 14 | public static String INVALID_URL = "INVALID_URL"; 15 | public static String INVALID_EMAIL = "INVALID_EMAIL"; 16 | public static String OTHER = "OTHER"; 17 | public static String FAILED = "FAILED"; 18 | 19 | private String code; 20 | InvalidPackException(String code, String message){ 21 | super(message); 22 | this.code = code; 23 | } 24 | 25 | String getCode(){ 26 | return this.code; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/src/main/kotlin/com/indiagenisys/whatsapp_stickers_handler/Sticker.java: -------------------------------------------------------------------------------- 1 | 2 | package com.indiagenisys.whatsapp_stickers_handler; 3 | 4 | import android.os.Build; 5 | import android.os.Parcel; 6 | import android.os.Parcelable; 7 | 8 | import androidx.annotation.RequiresApi; 9 | 10 | import java.util.List; 11 | import java.util.Objects; 12 | 13 | class Sticker implements Parcelable { 14 | final String imageFileName; 15 | final List emojis; 16 | long size; 17 | 18 | Sticker(String imageFileName, List emojis) { 19 | this.imageFileName = imageFileName; 20 | this.emojis = emojis; 21 | } 22 | 23 | private Sticker(Parcel in) { 24 | imageFileName = in.readString(); 25 | emojis = in.createStringArrayList(); 26 | size = in.readLong(); 27 | } 28 | 29 | public static final Creator CREATOR = new Creator() { 30 | @Override 31 | public Sticker createFromParcel(Parcel in) { 32 | return new Sticker(in); 33 | } 34 | 35 | @Override 36 | public Sticker[] newArray(int size) { 37 | return new Sticker[size]; 38 | } 39 | }; 40 | 41 | @Override 42 | public String toString() { 43 | return "Sticker{" + 44 | "imageFileName='" + imageFileName + '\'' + 45 | ", emojis=" + emojis + 46 | ", size=" + size + 47 | '}'; 48 | } 49 | 50 | public void setSize(long size) { 51 | this.size = size; 52 | } 53 | 54 | @Override 55 | public int describeContents() { 56 | return 0; 57 | } 58 | 59 | @Override 60 | public void writeToParcel(Parcel dest, int flags) { 61 | dest.writeString(imageFileName); 62 | dest.writeStringList(emojis); 63 | dest.writeLong(size); 64 | } 65 | 66 | @RequiresApi(api = Build.VERSION_CODES.KITKAT) 67 | @Override 68 | public boolean equals(Object o) { 69 | if (this == o) return true; 70 | if (o == null || getClass() != o.getClass()) return false; 71 | Sticker sticker = (Sticker) o; 72 | return Objects.equals(imageFileName, sticker.imageFileName); 73 | } 74 | 75 | @RequiresApi(api = Build.VERSION_CODES.KITKAT) 76 | @Override 77 | public int hashCode() { 78 | return Objects.hash(imageFileName, emojis, size); 79 | } 80 | } -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/src/main/kotlin/com/indiagenisys/whatsapp_stickers_handler/StickerPack.java: -------------------------------------------------------------------------------- 1 | 2 | package com.indiagenisys.whatsapp_stickers_handler; 3 | 4 | import android.os.Parcel; 5 | import android.os.Parcelable; 6 | 7 | import java.util.List; 8 | 9 | class StickerPack implements Parcelable { 10 | final String identifier; 11 | final String name; 12 | final String publisher; 13 | String trayImageFile; 14 | final String publisherEmail; 15 | final String publisherWebsite; 16 | final String privacyPolicyWebsite; 17 | final String licenseAgreementWebsite; 18 | String imageDataVersion; 19 | final boolean avoidCache; 20 | final boolean animatedStickerPack; 21 | 22 | String iosAppStoreLink; 23 | private List stickers; 24 | private long totalSize; 25 | String androidPlayStoreLink; 26 | private boolean isWhitelisted; 27 | 28 | StickerPack(String identifier, String name, String publisher, String trayImageFile, String publisherEmail, String publisherWebsite, String privacyPolicyWebsite, String licenseAgreementWebsite, String imageDataVersion, boolean avoidCache, boolean animatedStickerPack) { 29 | this.identifier = identifier; 30 | this.name = name; 31 | this.publisher = publisher; 32 | this.trayImageFile = trayImageFile; 33 | this.publisherEmail = publisherEmail; 34 | this.publisherWebsite = publisherWebsite; 35 | this.privacyPolicyWebsite = privacyPolicyWebsite; 36 | this.licenseAgreementWebsite = licenseAgreementWebsite; 37 | this.imageDataVersion = imageDataVersion; 38 | this.avoidCache = avoidCache; 39 | this.animatedStickerPack = animatedStickerPack; 40 | } 41 | 42 | void setIsWhitelisted(boolean isWhitelisted) { 43 | this.isWhitelisted = isWhitelisted; 44 | } 45 | 46 | boolean getIsWhitelisted() { 47 | return isWhitelisted; 48 | } 49 | 50 | private StickerPack(Parcel in) { 51 | identifier = in.readString(); 52 | name = in.readString(); 53 | publisher = in.readString(); 54 | trayImageFile = in.readString(); 55 | publisherEmail = in.readString(); 56 | publisherWebsite = in.readString(); 57 | privacyPolicyWebsite = in.readString(); 58 | licenseAgreementWebsite = in.readString(); 59 | iosAppStoreLink = in.readString(); 60 | stickers = in.createTypedArrayList(Sticker.CREATOR); 61 | totalSize = in.readLong(); 62 | androidPlayStoreLink = in.readString(); 63 | isWhitelisted = in.readByte() != 0; 64 | imageDataVersion = in.readString(); 65 | avoidCache = in.readByte() != 0; 66 | animatedStickerPack = in.readByte() != 0; 67 | } 68 | 69 | public static final Creator CREATOR = new Creator() { 70 | @Override 71 | public StickerPack createFromParcel(Parcel in) { 72 | return new StickerPack(in); 73 | } 74 | 75 | @Override 76 | public StickerPack[] newArray(int size) { 77 | return new StickerPack[size]; 78 | } 79 | }; 80 | 81 | void setStickers(List stickers) { 82 | this.stickers = stickers; 83 | totalSize = 0; 84 | for (Sticker sticker : stickers) { 85 | totalSize += sticker.size; 86 | } 87 | } 88 | 89 | void setAndroidPlayStoreLink(String androidPlayStoreLink) { 90 | this.androidPlayStoreLink = androidPlayStoreLink; 91 | } 92 | 93 | void setIosAppStoreLink(String iosAppStoreLink) { 94 | this.iosAppStoreLink = iosAppStoreLink; 95 | } 96 | 97 | List getStickers() { 98 | return stickers; 99 | } 100 | 101 | long getTotalSize() { 102 | return totalSize; 103 | } 104 | 105 | Sticker getStickerByNameMatcher(String matcher) { 106 | for (int i = 0; i < getStickers().size(); i++) { 107 | Sticker sticker = getStickers().get(i); 108 | if (sticker.imageFileName.contains(matcher)) { 109 | return sticker; 110 | } 111 | } 112 | return null; 113 | } 114 | 115 | @Override 116 | public int describeContents() { 117 | return 0; 118 | } 119 | 120 | @Override 121 | public String toString() { 122 | return "StickerPack{" + 123 | "identifier='" + identifier + '\'' + 124 | ", name='" + name + '\'' + 125 | ", publisher='" + publisher + '\'' + 126 | ", trayImageFile='" + trayImageFile + '\'' + 127 | ", publisherEmail='" + publisherEmail + '\'' + 128 | ", publisherWebsite='" + publisherWebsite + '\'' + 129 | ", privacyPolicyWebsite='" + privacyPolicyWebsite + '\'' + 130 | ", licenseAgreementWebsite='" + licenseAgreementWebsite + '\'' + 131 | ", imageDataVersion='" + imageDataVersion + '\'' + 132 | ", avoidCache=" + avoidCache + 133 | ", animatedStickerPack=" + animatedStickerPack + 134 | ", iosAppStoreLink='" + iosAppStoreLink + '\'' + 135 | ", stickers=" + stickers + 136 | ", totalSize=" + totalSize + 137 | ", androidPlayStoreLink='" + androidPlayStoreLink + '\'' + 138 | ", isWhitelisted=" + isWhitelisted + 139 | '}'; 140 | } 141 | 142 | @Override 143 | public void writeToParcel(Parcel dest, int flags) { 144 | dest.writeString(identifier); 145 | dest.writeString(name); 146 | dest.writeString(publisher); 147 | dest.writeString(trayImageFile); 148 | dest.writeString(publisherEmail); 149 | dest.writeString(publisherWebsite); 150 | dest.writeString(privacyPolicyWebsite); 151 | dest.writeString(licenseAgreementWebsite); 152 | dest.writeString(iosAppStoreLink); 153 | dest.writeTypedList(stickers); 154 | dest.writeLong(totalSize); 155 | dest.writeString(androidPlayStoreLink); 156 | dest.writeByte((byte) (isWhitelisted ? 1 : 0)); 157 | dest.writeString(imageDataVersion); 158 | dest.writeByte((byte) (avoidCache ? 1 : 0)); 159 | dest.writeByte((byte) (animatedStickerPack ? 1 : 0)); 160 | } 161 | } -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/src/main/kotlin/com/indiagenisys/whatsapp_stickers_handler/StickerPackLoader.java: -------------------------------------------------------------------------------- 1 | 2 | package com.indiagenisys.whatsapp_stickers_handler; 3 | 4 | import android.content.ContentResolver; 5 | import android.content.Context; 6 | import android.content.res.AssetFileDescriptor; 7 | import android.content.res.AssetManager; 8 | import android.database.Cursor; 9 | import android.net.Uri; 10 | 11 | import androidx.annotation.NonNull; 12 | 13 | import android.os.ParcelFileDescriptor; 14 | import android.text.TextUtils; 15 | import android.util.Log; 16 | 17 | import java.io.ByteArrayOutputStream; 18 | import java.io.File; 19 | import java.io.IOException; 20 | import java.io.InputStream; 21 | import java.util.ArrayList; 22 | import java.util.Arrays; 23 | import java.util.HashSet; 24 | import java.util.List; 25 | 26 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.ANDROID_APP_DOWNLOAD_LINK_IN_QUERY; 27 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.ANIMATED_STICKER_PACK; 28 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.AVOID_CACHE; 29 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.IOS_APP_DOWNLOAD_LINK_IN_QUERY; 30 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.LICENSE_AGREEMENT_WEBSITE; 31 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.PRIVACY_POLICY_WEBSITE; 32 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.PUBLISHER_EMAIL; 33 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.PUBLISHER_WEBSITE; 34 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.STICKER_FILE_EMOJI_IN_QUERY; 35 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.STICKER_FILE_NAME_IN_QUERY; 36 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.STICKER_PACK_ICON_IN_QUERY; 37 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.STICKER_PACK_IDENTIFIER_IN_QUERY; 38 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.STICKER_PACK_NAME_IN_QUERY; 39 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.STICKER_PACK_PUBLISHER_IN_QUERY; 40 | import static com.indiagenisys.whatsapp_stickers_handler.StickerContentProvider.IMAGE_DATA_VERSION; 41 | 42 | class StickerPackLoader { 43 | 44 | 45 | @NonNull 46 | static ArrayList fetchStickerPacks(Context context) throws IllegalStateException { 47 | final Cursor cursor = context.getContentResolver().query(WhatsappStickersHandlerPlugin.getContentProviderAuthorityURI(context), null, null, null, null); 48 | if (cursor == null) { 49 | throw new IllegalStateException("could not fetch from content provider, " + WhatsappStickersHandlerPlugin.getContentProviderAuthority(context)); 50 | } 51 | HashSet identifierSet = new HashSet<>(); 52 | final ArrayList stickerPackList = fetchFromContentProvider(cursor); 53 | for (StickerPack stickerPack : stickerPackList) { 54 | if (identifierSet.contains(stickerPack.identifier)) { 55 | throw new IllegalStateException("sticker pack identifiers should be unique, there are more than one pack with identifier:" + stickerPack.identifier); 56 | } else { 57 | identifierSet.add(stickerPack.identifier); 58 | } 59 | } 60 | for (StickerPack stickerPack : stickerPackList) { 61 | final List stickers = getStickersForPack(context, stickerPack); 62 | stickerPack.setStickers(stickers); 63 | try { 64 | StickerPackValidator.verifyStickerPackValidity(context, stickerPack); 65 | } catch (InvalidPackException e) { 66 | e.printStackTrace(); 67 | } 68 | } 69 | return stickerPackList; 70 | } 71 | 72 | @NonNull 73 | private static List getStickersForPack(Context context, StickerPack stickerPack) { 74 | final List stickers = fetchFromContentProviderForStickers(stickerPack.identifier, context); 75 | for (Sticker sticker : stickers) { 76 | final byte[] bytes; 77 | try { 78 | bytes = fetchStickerAsset(stickerPack.identifier, sticker.imageFileName, context); 79 | if (bytes.length <= 0) { 80 | throw new IllegalStateException("Asset file is empty, pack: " + stickerPack.name + ", sticker: " + sticker.imageFileName); 81 | } 82 | sticker.setSize(bytes.length); 83 | } catch (IOException | IllegalArgumentException e) { 84 | throw new IllegalStateException("Asset file doesn't exist. pack: " + stickerPack.name + ", sticker: " + sticker.imageFileName, e); 85 | } 86 | } 87 | return stickers; 88 | } 89 | 90 | 91 | @NonNull 92 | private static ArrayList fetchFromContentProvider(Cursor cursor) { 93 | ArrayList stickerPackList = new ArrayList<>(); 94 | cursor.moveToFirst(); 95 | do { 96 | final String identifier = cursor.getString(cursor.getColumnIndexOrThrow(STICKER_PACK_IDENTIFIER_IN_QUERY)); 97 | final String name = cursor.getString(cursor.getColumnIndexOrThrow(STICKER_PACK_NAME_IN_QUERY)); 98 | final String publisher = cursor.getString(cursor.getColumnIndexOrThrow(STICKER_PACK_PUBLISHER_IN_QUERY)); 99 | final String trayImage = cursor.getString(cursor.getColumnIndexOrThrow(STICKER_PACK_ICON_IN_QUERY)); 100 | final String androidPlayStoreLink = cursor.getString(cursor.getColumnIndexOrThrow(ANDROID_APP_DOWNLOAD_LINK_IN_QUERY)); 101 | final String iosAppLink = cursor.getString(cursor.getColumnIndexOrThrow(IOS_APP_DOWNLOAD_LINK_IN_QUERY)); 102 | final String publisherEmail = cursor.getString(cursor.getColumnIndexOrThrow(PUBLISHER_EMAIL)); 103 | final String publisherWebsite = cursor.getString(cursor.getColumnIndexOrThrow(PUBLISHER_WEBSITE)); 104 | final String privacyPolicyWebsite = cursor.getString(cursor.getColumnIndexOrThrow(PRIVACY_POLICY_WEBSITE)); 105 | final String licenseAgreementWebsite = cursor.getString(cursor.getColumnIndexOrThrow(LICENSE_AGREEMENT_WEBSITE)); 106 | final String imageDataVersion = cursor.getString(cursor.getColumnIndexOrThrow(IMAGE_DATA_VERSION)); 107 | final boolean avoidCache = cursor.getShort(cursor.getColumnIndexOrThrow(AVOID_CACHE)) > 0; 108 | final boolean animatedStickerPack = cursor.getShort(cursor.getColumnIndexOrThrow(ANIMATED_STICKER_PACK)) > 0; 109 | final StickerPack stickerPack = new StickerPack(identifier, name, publisher, trayImage, publisherEmail, publisherWebsite, privacyPolicyWebsite, licenseAgreementWebsite, imageDataVersion, avoidCache, animatedStickerPack); 110 | stickerPack.setAndroidPlayStoreLink(androidPlayStoreLink); 111 | stickerPack.setIosAppStoreLink(iosAppLink); 112 | stickerPackList.add(stickerPack); 113 | } while (cursor.moveToNext()); 114 | return stickerPackList; 115 | } 116 | 117 | @NonNull 118 | private static List fetchFromContentProviderForStickers(String identifier, Context context) { 119 | Uri uri = getStickerListUri(context, identifier); 120 | ContentResolver contentResolver = context.getContentResolver(); 121 | final String[] projection = {STICKER_FILE_NAME_IN_QUERY, STICKER_FILE_EMOJI_IN_QUERY}; 122 | final Cursor cursor = contentResolver.query(uri, projection, null, null, null); 123 | List stickers = new ArrayList<>(); 124 | if (cursor != null && cursor.getCount() > 0) { 125 | cursor.moveToFirst(); 126 | do { 127 | final String name = cursor.getString(cursor.getColumnIndexOrThrow(STICKER_FILE_NAME_IN_QUERY)); 128 | final String emojisConcatenated = cursor.getString(cursor.getColumnIndexOrThrow(STICKER_FILE_EMOJI_IN_QUERY)); 129 | List emojis = new ArrayList<>(StickerPackValidator.EMOJI_MAX_LIMIT); 130 | if (!TextUtils.isEmpty(emojisConcatenated)) { 131 | emojis = Arrays.asList(emojisConcatenated.split(",")); 132 | } 133 | stickers.add(new Sticker(name, emojis)); 134 | } while (cursor.moveToNext()); 135 | } 136 | if (cursor != null) { 137 | cursor.close(); 138 | } 139 | return stickers; 140 | } 141 | 142 | static private AssetFileDescriptor fetchFile(AssetManager am, @NonNull final String fileName) { 143 | return (fileName.contains("_SSP_")) ? fetchAssetFile(am, fileName) : fetchNonAssetFile(fileName); 144 | } 145 | 146 | static private AssetFileDescriptor fetchNonAssetFile(final String fileName) { 147 | try { 148 | String fname = fileName.replace("._.", File.separator); 149 | final File file = new File(fname); 150 | return new AssetFileDescriptor(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY), 0, 151 | AssetFileDescriptor.UNKNOWN_LENGTH); 152 | } catch (final IOException e) { 153 | Log.e("error", 154 | "IOException when getting asset file:"+ fileName, e); 155 | return null; 156 | } 157 | } 158 | 159 | static private AssetFileDescriptor fetchAssetFile(@NonNull final AssetManager am, 160 | @NonNull final String fileName) { 161 | try { 162 | String fname = fileName.replace("_SSP_", File.separator); 163 | String f = "flutter_assets/"+fname; 164 | return am.openFd(f); 165 | } catch (final IOException e) { 166 | Log.e("error", 167 | "IOException when getting asset file:" + fileName, e); 168 | return null; 169 | } 170 | } 171 | 172 | static byte[] fetchStickerAsset(@NonNull final String identifier, @NonNull final String name, Context context) throws IOException { 173 | 174 | InputStream inputStream = fetchFile(context.getAssets(), name).createInputStream(); 175 | final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 176 | if (inputStream == null) { 177 | String stickerFileName = name.replace("_SSP_",File.separator); 178 | stickerFileName = stickerFileName.replace("._.", File.separator); 179 | throw new IOException("cannot read sticker asset:" + stickerFileName); 180 | } 181 | int read; 182 | byte[] data = new byte[16384]; 183 | 184 | while ((read = inputStream.read(data, 0, data.length)) != -1) { 185 | buffer.write(data, 0, read); 186 | } 187 | return buffer.toByteArray(); 188 | 189 | } 190 | 191 | static Uri getStickerListUri(Context context, String identifier) { 192 | return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(WhatsappStickersHandlerPlugin.getContentProviderAuthority(context)).appendPath(StickerContentProvider.STICKERS).appendPath(identifier).build(); 193 | } 194 | 195 | static Uri getStickerAssetUri(Context context, String identifier, String stickerName) { 196 | return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(WhatsappStickersHandlerPlugin.getContentProviderAuthority(context)).appendPath(StickerContentProvider.STICKERS_ASSET).appendPath(identifier).appendPath(stickerName).build(); 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/src/main/kotlin/com/indiagenisys/whatsapp_stickers_handler/WhatsappStickersHandlerPlugin.kt: -------------------------------------------------------------------------------- 1 | package com.indiagenisys.whatsapp_stickers_handler 2 | 3 | import android.app.Activity 4 | import android.content.ActivityNotFoundException 5 | import android.content.ContentResolver 6 | import android.content.Context 7 | import android.content.Intent 8 | import android.net.Uri 9 | import android.util.Log 10 | import androidx.annotation.NonNull 11 | import io.flutter.embedding.engine.plugins.FlutterPlugin 12 | import io.flutter.embedding.engine.plugins.activity.ActivityAware 13 | import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding 14 | import io.flutter.plugin.common.MethodCall 15 | import io.flutter.plugin.common.MethodChannel 16 | import io.flutter.plugin.common.MethodChannel.MethodCallHandler 17 | import io.flutter.plugin.common.MethodChannel.Result 18 | import io.flutter.plugin.common.PluginRegistry 19 | 20 | 21 | /** WhatsappStickersHandlerPlugin */ 22 | class WhatsappStickersHandlerPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, PluginRegistry.ActivityResultListener { 23 | /// The MethodChannel that will the communication between Flutter and native Android 24 | /// 25 | /// This local reference serves to register the plugin with the Flutter Engine and unregister it 26 | /// when the Flutter Engine is detached from the Activity 27 | private lateinit var channel: MethodChannel 28 | private var context: Context? = null 29 | 30 | private var activity: Activity? = null 31 | private var result: Result? = null 32 | 33 | private var add_pack: Int = 200 34 | private var stickerPackList: List? = null 35 | 36 | override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { 37 | channel = MethodChannel(flutterPluginBinding.binaryMessenger, "whatsapp_stickers_handler") 38 | channel.setMethodCallHandler(this) 39 | } 40 | 41 | override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) { 42 | this.result = result 43 | when (call.method) { 44 | "platformVersion" -> { 45 | result.success("Android ${android.os.Build.VERSION.RELEASE}") 46 | } 47 | "isWhatsAppInstalled" -> { 48 | result.success(WhitelistCheck.isWhatsAppInstalled(context as Context)) 49 | } 50 | "isWhatsAppConsumerAppInstalled" -> { 51 | result.success(WhitelistCheck.isWhatsAppConsumerAppInstalled(context?.packageManager)) 52 | } 53 | "isWhatsAppSmbAppInstalled" -> { 54 | result.success(WhitelistCheck.isWhatsAppSmbAppInstalled(context?.packageManager)) 55 | } 56 | "isStickerPackInstalled" -> { 57 | val stickerPackIdentifier = call.argument("identifier"); 58 | if (stickerPackIdentifier != null && context != null) { 59 | val installed = WhitelistCheck.isWhitelisted(context!!, stickerPackIdentifier) 60 | result.success(installed) 61 | } 62 | } 63 | "launchWhatsApp" -> { 64 | try { 65 | val launchIntent: Intent = context?.packageManager?.getLaunchIntentForPackage(WhitelistCheck.CONSUMER_WHATSAPP_PACKAGE_NAME)!! 66 | activity?.startActivity(launchIntent) 67 | result.success(true) 68 | } catch (e: Exception) { 69 | e.message?.let { Log.e("TEST", it) } 70 | } 71 | } 72 | "addStickerPack" -> { 73 | try { 74 | val stickerPack: StickerPack = ConfigFileManager.fromMethodCall(context, call) 75 | // update json file 76 | ConfigFileManager.addNewPack(context, stickerPack) 77 | context?.let { StickerPackValidator.verifyStickerPackValidity(it, stickerPack) }; 78 | // send intent to whatsapp 79 | val ws = WhitelistCheck.isWhatsAppConsumerAppInstalled(context?.packageManager) 80 | if (!(ws || WhitelistCheck.isWhatsAppSmbAppInstalled(context?.packageManager))) { 81 | throw InvalidPackException(InvalidPackException.OTHER, "WhatsApp is not installed on target device!") 82 | } 83 | val stickerPackIdentifier = stickerPack.identifier 84 | val stickerPackName = stickerPack.name 85 | val authority: String? = context?.let { getContentProviderAuthority(it) } 86 | 87 | val intent = createIntentToAddStickerPack(authority, stickerPackIdentifier, stickerPackName) 88 | 89 | try { 90 | this.activity?.startActivityForResult(Intent.createChooser(intent, "ADD Sticker"), add_pack) 91 | } catch (e: ActivityNotFoundException) { 92 | throw InvalidPackException( 93 | InvalidPackException.FAILED, 94 | "Sticker pack not added. If you'd like to add it, make sure you update to the latest version of WhatsApp." 95 | ) 96 | } 97 | 98 | } catch (e: InvalidPackException) { 99 | e.message?.let { Log.e("ERROR", it) }; 100 | result.error(e.code, e.message, null) 101 | } 102 | } 103 | else -> { 104 | result.notImplemented() 105 | } 106 | } 107 | } 108 | 109 | override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) { 110 | channel.setMethodCallHandler(null) 111 | } 112 | 113 | override fun onAttachedToActivity(binding: ActivityPluginBinding) { 114 | activity = binding.activity 115 | context = binding.activity.applicationContext; 116 | binding.addActivityResultListener(this) 117 | } 118 | 119 | override fun onDetachedFromActivityForConfigChanges() { 120 | activity = null 121 | } 122 | 123 | override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { 124 | activity = null 125 | binding.addActivityResultListener(this) 126 | } 127 | 128 | override fun onDetachedFromActivity() { 129 | activity = null 130 | context = null 131 | result = null 132 | } 133 | 134 | override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean { 135 | if (requestCode == add_pack) { 136 | if (resultCode == Activity.RESULT_CANCELED) { 137 | if (data != null) { 138 | val validationError = data.getStringExtra("validation_error") 139 | if (validationError != null) { 140 | result?.error("error", validationError, "") 141 | } 142 | } else { 143 | result?.error("cancelled", "cancelled", "") 144 | } 145 | } else if (resultCode == Activity.RESULT_OK) { 146 | if (data != null) { 147 | val bundle = data.extras!! 148 | if (bundle!!.containsKey("add_successful")) { 149 | result?.success("add_successful") 150 | } else if (bundle!!.containsKey("already_added")) { 151 | result?.error("already_added", "already_added", "") 152 | } else { 153 | result?.success("success") 154 | } 155 | } else { 156 | result?.success("success") 157 | } 158 | } else { 159 | result?.success("unknown") 160 | } 161 | } 162 | return true 163 | } 164 | 165 | fun createIntentToAddStickerPack(authority: String?, identifier: String?, stickerPackName: String?): Intent? { 166 | val intent = Intent() 167 | intent.action = "com.whatsapp.intent.action.ENABLE_STICKER_PACK" 168 | intent.putExtra(EXTRA_STICKER_PACK_ID, identifier) 169 | intent.putExtra(EXTRA_STICKER_PACK_AUTHORITY, authority) 170 | intent.putExtra(EXTRA_STICKER_PACK_NAME, stickerPackName) 171 | return intent 172 | } 173 | 174 | /// Get content provider Uri & String 175 | /// Accessible from class whitelist check 176 | companion object { 177 | 178 | private const val EXTRA_STICKER_PACK_ID = "sticker_pack_id" 179 | private const val EXTRA_STICKER_PACK_AUTHORITY = "sticker_pack_authority" 180 | private const val EXTRA_STICKER_PACK_NAME = "sticker_pack_name" 181 | 182 | @JvmStatic 183 | fun getContentProviderAuthorityURI(context: Context): Uri { 184 | return Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(Companion.getContentProviderAuthority(context)) 185 | .appendPath(StickerContentProvider.METADATA).build() 186 | } 187 | 188 | @JvmStatic 189 | fun getContentProviderAuthority(context: Context): String { 190 | return context.packageName + ".stickercontentprovider" 191 | } 192 | } 193 | 194 | } 195 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/android/src/main/kotlin/com/indiagenisys/whatsapp_stickers_handler/WhitelistCheck.java: -------------------------------------------------------------------------------- 1 | 2 | package com.indiagenisys.whatsapp_stickers_handler; 3 | 4 | import android.content.ContentResolver; 5 | import android.content.Context; 6 | import android.content.pm.ApplicationInfo; 7 | import android.content.pm.PackageManager; 8 | import android.content.pm.ProviderInfo; 9 | import android.database.Cursor; 10 | import android.net.Uri; 11 | import android.util.Log; 12 | 13 | import androidx.annotation.NonNull; 14 | 15 | @SuppressWarnings("FieldCanBeLocal") 16 | class WhitelistCheck { 17 | private static final String AUTHORITY_QUERY_PARAM = "authority"; 18 | private static final String IDENTIFIER_QUERY_PARAM = "identifier"; 19 | 20 | public static String CONSUMER_WHATSAPP_PACKAGE_NAME = "com.whatsapp"; 21 | public static String SMB_WHATSAPP_PACKAGE_NAME = "com.whatsapp.w4b"; 22 | private static String CONTENT_PROVIDER = ".provider.sticker_whitelist_check"; 23 | private static String QUERY_PATH = "is_whitelisted"; 24 | private static String QUERY_RESULT_COLUMN_NAME = "result"; 25 | 26 | private static String TAG = "WhitelistCheck"; 27 | 28 | static boolean isWhitelisted(@NonNull Context context, @NonNull String identifier) { 29 | try { 30 | if (!isWhatsAppConsumerAppInstalled(context.getPackageManager()) && !isWhatsAppSmbAppInstalled(context.getPackageManager())) { 31 | return false; 32 | } 33 | 34 | boolean consumerResult = isStickerPackWhitelistedInWhatsAppConsumer(context, identifier); 35 | boolean smbResult = isStickerPackWhitelistedInWhatsAppSmb(context, identifier); 36 | //Log.e("WHITELISTED", consumerResult + " " + smbResult); 37 | return consumerResult && smbResult; 38 | } catch (Exception e) { 39 | return false; 40 | } 41 | } 42 | 43 | static boolean isWhatsAppInstalled(@NonNull Context context) { 44 | try { 45 | return (isWhatsAppConsumerAppInstalled(context.getPackageManager()) || isWhatsAppSmbAppInstalled(context.getPackageManager())); 46 | } catch (Exception e) { 47 | return false; 48 | } 49 | } 50 | 51 | private static boolean isWhitelistedFromProvider(@NonNull Context context, @NonNull String identifier, String whatsappPackageName) { 52 | final PackageManager packageManager = context.getPackageManager(); 53 | 54 | if (isPackageInstalled(whatsappPackageName, packageManager)) { 55 | final String whatsAppProviderAuthority = whatsappPackageName + CONTENT_PROVIDER; 56 | final ProviderInfo providerInfo = packageManager.resolveContentProvider(whatsAppProviderAuthority, PackageManager.GET_META_DATA); 57 | 58 | // provider is not there. The WhatsApp app may be an old version. 59 | if (providerInfo == null) { 60 | return false; 61 | } 62 | 63 | final Uri queryUri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) 64 | .authority(whatsAppProviderAuthority) 65 | .appendPath(QUERY_PATH) 66 | .appendQueryParameter(AUTHORITY_QUERY_PARAM, WhatsappStickersHandlerPlugin.getContentProviderAuthority(context)) 67 | .appendQueryParameter(IDENTIFIER_QUERY_PARAM, identifier).build(); 68 | 69 | try (final Cursor cursor = context.getContentResolver().query(queryUri, null, null, null, null)) { 70 | if (cursor != null && cursor.moveToFirst()) { 71 | final int whiteListResult = cursor.getInt(cursor.getColumnIndexOrThrow(QUERY_RESULT_COLUMN_NAME)); 72 | 73 | return whiteListResult == 1; 74 | } 75 | } 76 | } else { 77 | // if app is not installed, then don't need to take into its whitelist info into account. 78 | return true; 79 | } 80 | return false; 81 | } 82 | 83 | private static boolean isPackageInstalled(String packageName, PackageManager packageManager) { 84 | try { 85 | final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0); 86 | 87 | //noinspection SimplifiableIfStatement 88 | return applicationInfo.enabled; 89 | } catch (PackageManager.NameNotFoundException e) { 90 | return false; 91 | } 92 | } 93 | 94 | static boolean isWhatsAppConsumerAppInstalled(PackageManager packageManager) { 95 | return WhitelistCheck.isPackageInstalled(CONSUMER_WHATSAPP_PACKAGE_NAME, packageManager); 96 | } 97 | 98 | static boolean isWhatsAppSmbAppInstalled(PackageManager packageManager) { 99 | return WhitelistCheck.isPackageInstalled(SMB_WHATSAPP_PACKAGE_NAME, packageManager); 100 | } 101 | 102 | static boolean isStickerPackWhitelistedInWhatsAppConsumer(@NonNull Context context, @NonNull String identifier) { 103 | return isWhitelistedFromProvider(context, identifier, CONSUMER_WHATSAPP_PACKAGE_NAME); 104 | } 105 | 106 | static boolean isStickerPackWhitelistedInWhatsAppSmb(@NonNull Context context, @NonNull String identifier) { 107 | return isWhitelistedFromProvider(context, identifier, SMB_WHATSAPP_PACKAGE_NAME); 108 | } 109 | } -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/Generated.xcconfig 37 | /Flutter/ephemeral/ 38 | /Flutter/flutter_export_environment.sh -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/ios/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/plugins/whatsapp_stickers_handler/ios/Assets/.gitkeep -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/ios/Classes/SwiftWhatsappStickersHandlerPlugin.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | 4 | public class SwiftWhatsappStickersHandlerPlugin: NSObject, FlutterPlugin { 5 | public static func register(with registrar: FlutterPluginRegistrar) { 6 | let channel = FlutterMethodChannel(name: "whatsapp_stickers_handler", binaryMessenger: registrar.messenger()) 7 | let instance = SwiftWhatsappStickersHandlerPlugin() 8 | registrar.addMethodCallDelegate(instance, channel: channel) 9 | } 10 | 11 | public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { 12 | result("iOS " + UIDevice.current.systemVersion) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/ios/Classes/WhatsappStickersHandlerPlugin.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface WhatsappStickersHandlerPlugin : NSObject 4 | @end 5 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/ios/Classes/WhatsappStickersHandlerPlugin.m: -------------------------------------------------------------------------------- 1 | #import "WhatsappStickersHandlerPlugin.h" 2 | #if __has_include() 3 | #import 4 | #else 5 | // Support project import fallback if the generated compatibility header 6 | // is not copied when this plugin is created as a library. 7 | // https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816 8 | #import "whatsapp_stickers_handler-Swift.h" 9 | #endif 10 | 11 | @implementation WhatsappStickersHandlerPlugin 12 | + (void)registerWithRegistrar:(NSObject*)registrar { 13 | [SwiftWhatsappStickersHandlerPlugin registerWithRegistrar:registrar]; 14 | } 15 | @end 16 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/ios/whatsapp_stickers_handler.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. 3 | # Run `pod lib lint whatsapp_stickers_handler.podspec` to validate before publishing. 4 | # 5 | Pod::Spec.new do |s| 6 | s.name = 'whatsapp_stickers_handler' 7 | s.version = '0.0.1' 8 | s.summary = 'A new flutter plugin project.' 9 | s.description = <<-DESC 10 | A new flutter plugin project. 11 | DESC 12 | s.homepage = 'http://example.com' 13 | s.license = { :file => '../LICENSE' } 14 | s.author = { 'Your Company' => 'email@example.com' } 15 | s.source = { :path => '.' } 16 | s.source_files = 'Classes/**/*' 17 | s.dependency 'Flutter' 18 | s.platform = :ios, '9.0' 19 | 20 | # Flutter.framework does not contain a i386 slice. 21 | s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } 22 | s.swift_version = '5.0' 23 | end 24 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/lib/exceptions.dart: -------------------------------------------------------------------------------- 1 | class WhatsappStickersException implements Exception { 2 | final String? cause; 3 | 4 | WhatsappStickersException(this.cause); 5 | } 6 | 7 | class WhatsappStickersFileNotFoundException extends WhatsappStickersException { 8 | static const String CODE = 'FILE_NOT_FOUND'; 9 | 10 | final String? cause; 11 | 12 | WhatsappStickersFileNotFoundException(this.cause) : super(''); 13 | } 14 | 15 | class WhatsappStickersNumOutsideAllowableRangeException 16 | extends WhatsappStickersException { 17 | static const String CODE = 'OUTSIDE_ALLOWABLE_RANGE'; 18 | 19 | final String? cause; 20 | 21 | WhatsappStickersNumOutsideAllowableRangeException(this.cause) : super(''); 22 | } 23 | 24 | class WhatsappStickersUnsupportedImageFormatException 25 | extends WhatsappStickersException { 26 | static const String CODE = 'UNSUPPORTED_IMAGE_FORMAT'; 27 | 28 | final String? cause; 29 | 30 | WhatsappStickersUnsupportedImageFormatException(this.cause) : super(''); 31 | } 32 | 33 | class WhatsappStickersImageTooBigException extends WhatsappStickersException { 34 | static const String CODE = 'IMAGE_TOO_BIG'; 35 | 36 | final String? cause; 37 | 38 | WhatsappStickersImageTooBigException(this.cause) : super(''); 39 | } 40 | 41 | class WhatsappStickersIncorrectImageSizeException 42 | extends WhatsappStickersException { 43 | static const String CODE = 'INCORRECT_IMAGE_SIZE'; 44 | 45 | final String? cause; 46 | 47 | WhatsappStickersIncorrectImageSizeException(this.cause) : super(''); 48 | } 49 | 50 | class WhatsappStickersAnimatedImagesNotSupportedException 51 | extends WhatsappStickersException { 52 | static const String CODE = 'ANIMATED_IMAGES_NOT_SUPPORTED'; 53 | 54 | final String? cause; 55 | 56 | WhatsappStickersAnimatedImagesNotSupportedException(this.cause) : super(''); 57 | } 58 | 59 | class WhatsappStickersTooManyEmojisException extends WhatsappStickersException { 60 | static const String CODE = 'TOO_MANY_EMOJIS'; 61 | 62 | final String? cause; 63 | 64 | WhatsappStickersTooManyEmojisException(this.cause) : super(''); 65 | } 66 | 67 | class WhatsappStickersEmptyStringException extends WhatsappStickersException { 68 | static const String CODE = 'EMPTY_STRING'; 69 | 70 | final String? cause; 71 | 72 | WhatsappStickersEmptyStringException(this.cause) : super(''); 73 | } 74 | 75 | class WhatsappStickersStringTooLongException extends WhatsappStickersException { 76 | static const String CODE = 'STRING_TOO_LONG'; 77 | 78 | final String? cause; 79 | WhatsappStickersStringTooLongException(this.cause) : super(''); 80 | } 81 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/lib/whatsapp_stickers_handler.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/services.dart'; 4 | 5 | import 'exceptions.dart'; 6 | 7 | class WhatsappStickersHandler { 8 | static const consumerWhatsAppPackageName = 'com.whatsapp'; 9 | static const businessWhatsAppPackageName = 'com.whatsapp.w4b'; 10 | static const MethodChannel _channel = 11 | MethodChannel('whatsapp_stickers_handler'); 12 | 13 | /// Get the platform version 14 | static Future get platformVersion async { 15 | final String? version = await _channel.invokeMethod('platformVersion'); 16 | return version; 17 | } 18 | 19 | /// Check it whatsapp is installed or not 20 | static Future get isWhatsAppInstalled async { 21 | return await _channel.invokeMethod("isWhatsAppInstalled"); 22 | } 23 | 24 | /// Check if the WhatsApp consumer package is installed 25 | static Future get isWhatsAppConsumerAppInstalled async { 26 | return await _channel.invokeMethod("isWhatsAppConsumerAppInstalled"); 27 | } 28 | 29 | /// Check if the WhatsApp business package is installed 30 | static Future get isWhatsAppSmbAppInstalled async { 31 | return await _channel.invokeMethod("isWhatsAppSmbAppInstalled"); 32 | } 33 | 34 | /// Launch WhatsApp 35 | static void launchWhatsApp() { 36 | _channel.invokeMethod("launchWhatsApp"); 37 | } 38 | 39 | /// Check if a sticker pack is installed on WhatsApp 40 | /// 41 | /// [stickerPackIdentifier] The sticker pack identifier 42 | Future isStickerPackInstalled(String stickerPackIdentifier) async { 43 | final bool result = await _channel.invokeMethod( 44 | "isStickerPackInstalled", {"identifier": stickerPackIdentifier}); 45 | return result; 46 | } 47 | 48 | /// Add a sticker pack to whatsapp. 49 | Future addStickerPack( 50 | identifier, 51 | String name, 52 | String publisher, 53 | String trayImageFileName, 54 | String? publisherWebsite, 55 | String? privacyPolicyWebsite, 56 | String? licenseAgreementWebsite, 57 | bool? animatedStickerPack, 58 | Map> stickers, 59 | ) async { 60 | try { 61 | final payload = {}; 62 | payload['identifier'] = identifier; 63 | payload['name'] = name; 64 | payload['publisher'] = publisher; 65 | payload['trayImageFileName'] = trayImageFileName; 66 | payload['publisherWebsite'] = publisherWebsite; 67 | payload['privacyPolicyWebsite'] = privacyPolicyWebsite; 68 | payload['licenseAgreementWebsite'] = licenseAgreementWebsite; 69 | payload['animatedStickerPack'] = animatedStickerPack; 70 | payload['stickers'] = stickers; 71 | return await _channel.invokeMethod('addStickerPack', payload); 72 | } on PlatformException catch (e) { 73 | switch (e.code) { 74 | case WhatsappStickersFileNotFoundException.CODE: 75 | throw WhatsappStickersFileNotFoundException(e.message); 76 | case WhatsappStickersNumOutsideAllowableRangeException.CODE: 77 | throw WhatsappStickersNumOutsideAllowableRangeException(e.message); 78 | case WhatsappStickersUnsupportedImageFormatException.CODE: 79 | throw WhatsappStickersUnsupportedImageFormatException(e.message); 80 | case WhatsappStickersImageTooBigException.CODE: 81 | throw WhatsappStickersImageTooBigException(e.message); 82 | case WhatsappStickersIncorrectImageSizeException.CODE: 83 | throw WhatsappStickersIncorrectImageSizeException(e.message); 84 | case WhatsappStickersAnimatedImagesNotSupportedException.CODE: 85 | throw WhatsappStickersAnimatedImagesNotSupportedException(e.message); 86 | case WhatsappStickersTooManyEmojisException.CODE: 87 | throw WhatsappStickersTooManyEmojisException(e.message); 88 | case WhatsappStickersEmptyStringException.CODE: 89 | throw WhatsappStickersEmptyStringException(e.message); 90 | case WhatsappStickersStringTooLongException.CODE: 91 | throw WhatsappStickersStringTooLongException(e.message); 92 | default: 93 | throw WhatsappStickersException(e.message); 94 | } 95 | } 96 | } 97 | } 98 | 99 | class WhatsappStickerImageHandler { 100 | final String path; 101 | 102 | WhatsappStickerImageHandler._internal(this.path); 103 | 104 | factory WhatsappStickerImageHandler.fromAsset(String asset) { 105 | return WhatsappStickerImageHandler._internal('assets://$asset'); 106 | } 107 | 108 | factory WhatsappStickerImageHandler.fromFile(String file) { 109 | return WhatsappStickerImageHandler._internal('file://$file'); 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.9.0" 11 | boolean_selector: 12 | dependency: transitive 13 | description: 14 | name: boolean_selector 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.1.0" 18 | characters: 19 | dependency: transitive 20 | description: 21 | name: characters 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "1.2.1" 25 | clock: 26 | dependency: transitive 27 | description: 28 | name: clock 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.1.1" 32 | collection: 33 | dependency: transitive 34 | description: 35 | name: collection 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.16.0" 39 | dio: 40 | dependency: "direct main" 41 | description: 42 | name: dio 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "4.0.6" 46 | fake_async: 47 | dependency: transitive 48 | description: 49 | name: fake_async 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "1.3.1" 53 | ffi: 54 | dependency: transitive 55 | description: 56 | name: ffi 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "2.0.1" 60 | file: 61 | dependency: transitive 62 | description: 63 | name: file 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "6.1.4" 67 | flutter: 68 | dependency: "direct main" 69 | description: flutter 70 | source: sdk 71 | version: "0.0.0" 72 | flutter_lints: 73 | dependency: "direct dev" 74 | description: 75 | name: flutter_lints 76 | url: "https://pub.dartlang.org" 77 | source: hosted 78 | version: "2.0.1" 79 | flutter_test: 80 | dependency: "direct dev" 81 | description: flutter 82 | source: sdk 83 | version: "0.0.0" 84 | http_parser: 85 | dependency: transitive 86 | description: 87 | name: http_parser 88 | url: "https://pub.dartlang.org" 89 | source: hosted 90 | version: "4.0.2" 91 | lints: 92 | dependency: transitive 93 | description: 94 | name: lints 95 | url: "https://pub.dartlang.org" 96 | source: hosted 97 | version: "2.0.1" 98 | matcher: 99 | dependency: transitive 100 | description: 101 | name: matcher 102 | url: "https://pub.dartlang.org" 103 | source: hosted 104 | version: "0.12.12" 105 | material_color_utilities: 106 | dependency: transitive 107 | description: 108 | name: material_color_utilities 109 | url: "https://pub.dartlang.org" 110 | source: hosted 111 | version: "0.1.5" 112 | meta: 113 | dependency: transitive 114 | description: 115 | name: meta 116 | url: "https://pub.dartlang.org" 117 | source: hosted 118 | version: "1.8.0" 119 | path: 120 | dependency: transitive 121 | description: 122 | name: path 123 | url: "https://pub.dartlang.org" 124 | source: hosted 125 | version: "1.8.2" 126 | path_provider: 127 | dependency: "direct main" 128 | description: 129 | name: path_provider 130 | url: "https://pub.dartlang.org" 131 | source: hosted 132 | version: "2.0.11" 133 | path_provider_android: 134 | dependency: transitive 135 | description: 136 | name: path_provider_android 137 | url: "https://pub.dartlang.org" 138 | source: hosted 139 | version: "2.0.21" 140 | path_provider_ios: 141 | dependency: transitive 142 | description: 143 | name: path_provider_ios 144 | url: "https://pub.dartlang.org" 145 | source: hosted 146 | version: "2.0.11" 147 | path_provider_linux: 148 | dependency: transitive 149 | description: 150 | name: path_provider_linux 151 | url: "https://pub.dartlang.org" 152 | source: hosted 153 | version: "2.1.7" 154 | path_provider_macos: 155 | dependency: transitive 156 | description: 157 | name: path_provider_macos 158 | url: "https://pub.dartlang.org" 159 | source: hosted 160 | version: "2.0.6" 161 | path_provider_platform_interface: 162 | dependency: transitive 163 | description: 164 | name: path_provider_platform_interface 165 | url: "https://pub.dartlang.org" 166 | source: hosted 167 | version: "2.0.5" 168 | path_provider_windows: 169 | dependency: transitive 170 | description: 171 | name: path_provider_windows 172 | url: "https://pub.dartlang.org" 173 | source: hosted 174 | version: "2.1.3" 175 | platform: 176 | dependency: transitive 177 | description: 178 | name: platform 179 | url: "https://pub.dartlang.org" 180 | source: hosted 181 | version: "3.1.0" 182 | plugin_platform_interface: 183 | dependency: transitive 184 | description: 185 | name: plugin_platform_interface 186 | url: "https://pub.dartlang.org" 187 | source: hosted 188 | version: "2.1.3" 189 | process: 190 | dependency: transitive 191 | description: 192 | name: process 193 | url: "https://pub.dartlang.org" 194 | source: hosted 195 | version: "4.2.4" 196 | sky_engine: 197 | dependency: transitive 198 | description: flutter 199 | source: sdk 200 | version: "0.0.99" 201 | source_span: 202 | dependency: transitive 203 | description: 204 | name: source_span 205 | url: "https://pub.dartlang.org" 206 | source: hosted 207 | version: "1.9.0" 208 | stack_trace: 209 | dependency: transitive 210 | description: 211 | name: stack_trace 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "1.10.0" 215 | stream_channel: 216 | dependency: transitive 217 | description: 218 | name: stream_channel 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "2.1.0" 222 | string_scanner: 223 | dependency: transitive 224 | description: 225 | name: string_scanner 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "1.1.1" 229 | term_glyph: 230 | dependency: transitive 231 | description: 232 | name: term_glyph 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "1.2.1" 236 | test_api: 237 | dependency: transitive 238 | description: 239 | name: test_api 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "0.4.12" 243 | typed_data: 244 | dependency: transitive 245 | description: 246 | name: typed_data 247 | url: "https://pub.dartlang.org" 248 | source: hosted 249 | version: "1.3.1" 250 | vector_math: 251 | dependency: transitive 252 | description: 253 | name: vector_math 254 | url: "https://pub.dartlang.org" 255 | source: hosted 256 | version: "2.1.2" 257 | win32: 258 | dependency: transitive 259 | description: 260 | name: win32 261 | url: "https://pub.dartlang.org" 262 | source: hosted 263 | version: "3.1.1" 264 | xdg_directories: 265 | dependency: transitive 266 | description: 267 | name: xdg_directories 268 | url: "https://pub.dartlang.org" 269 | source: hosted 270 | version: "0.2.0+2" 271 | sdks: 272 | dart: ">=2.17.0 <3.0.0" 273 | flutter: ">=3.0.0" 274 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: whatsapp_stickers_handler 2 | description: Stickers for WhatsApp plugin to manage WPStickerApp. This plugin will helps you to add stickers to WhatsApp on Android and iOS devices. 3 | version: 0.0.1+1 4 | homepage: https://github.com/jigneshpandav/whatsapp_stickers_handler 5 | 6 | environment: 7 | sdk: ">=2.16.2 <3.0.0" 8 | flutter: ">=2.5.0" 9 | 10 | dependencies: 11 | dio: 12 | flutter: 13 | sdk: flutter 14 | path_provider: 15 | 16 | dev_dependencies: 17 | flutter_test: 18 | sdk: flutter 19 | flutter_lints: 20 | 21 | flutter: 22 | plugin: 23 | platforms: 24 | android: 25 | package: com.indiagenisys.whatsapp_stickers_handler 26 | pluginClass: WhatsappStickersHandlerPlugin 27 | ios: 28 | pluginClass: WhatsappStickersHandlerPlugin 29 | -------------------------------------------------------------------------------- /plugins/whatsapp_stickers_handler/test/whatsapp_stickers_handler_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/services.dart'; 2 | import 'package:flutter_test/flutter_test.dart'; 3 | import 'package:whatsapp_stickers_handler/whatsapp_stickers_handler.dart'; 4 | 5 | void main() { 6 | const MethodChannel channel = MethodChannel('whatsapp_stickers_handler'); 7 | 8 | TestWidgetsFlutterBinding.ensureInitialized(); 9 | 10 | setUp(() { 11 | channel.setMockMethodCallHandler((MethodCall methodCall) async { 12 | return '42'; 13 | }); 14 | }); 15 | 16 | tearDown(() { 17 | channel.setMockMethodCallHandler(null); 18 | }); 19 | 20 | test('getPlatformVersion', () async { 21 | expect(await WhatsappStickersHandler.platformVersion, '42'); 22 | }); 23 | } 24 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: trendy_whatsapp_stickers 2 | description: A new Flutter project. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `flutter pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | # In Windows, build-name is used as the major, minor, and patch parts 19 | # of the product and file versions while build-number is used as the build suffix. 20 | version: 1.0.0+1 21 | 22 | environment: 23 | sdk: '>=2.18.4 <3.0.0' 24 | 25 | # Dependencies specify other packages that your package needs in order to work. 26 | # To automatically upgrade your package dependencies to the latest versions 27 | # consider running `flutter pub upgrade --major-versions`. Alternatively, 28 | # dependencies can be manually updated by changing the version numbers below to 29 | # the latest version available on pub.dev. To see which dependencies have newer 30 | # versions available, run `flutter pub outdated`. 31 | dependencies: 32 | flutter: 33 | sdk: flutter 34 | whatsapp_stickers_handler: 35 | path: ./plugins/whatsapp_stickers_handler 36 | url_launcher: ^6.1.6 37 | cupertino_icons: ^1.0.2 38 | share_plus: ^6.3.0 39 | plugin_platform_interface: ^2.1.2 40 | 41 | dev_dependencies: 42 | flutter_test: 43 | sdk: flutter 44 | flutter_launcher_icons: 45 | flutter_lints: ^2.0.0 46 | 47 | # For information on the generic Dart part of this file, see the 48 | # following page: https://dart.dev/tools/pub/pubspec 49 | 50 | flutter_icons: 51 | android: "launcher_icon" 52 | ios: true 53 | image_path: "assets/images/logo.png" 54 | 55 | # The following section is specific to Flutter packages. 56 | flutter: 57 | 58 | # The following line ensures that the Material Icons font is 59 | # included with your application, so that you can use the icons in 60 | # the material Icons class. 61 | uses-material-design: true 62 | assets: 63 | - sticker_packs/1/ 64 | - sticker_packs/2/ 65 | - sticker_packs/3/ 66 | - sticker_packs/4/ 67 | - sticker_packs/5/ 68 | - sticker_packs/6/ 69 | - sticker_packs/7/ 70 | - sticker_packs/sticker_packs.json -------------------------------------------------------------------------------- /sticker_packs/1/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/1.png -------------------------------------------------------------------------------- /sticker_packs/1/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/1.webp -------------------------------------------------------------------------------- /sticker_packs/1/10.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/10.webp -------------------------------------------------------------------------------- /sticker_packs/1/11.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/11.webp -------------------------------------------------------------------------------- /sticker_packs/1/12.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/12.webp -------------------------------------------------------------------------------- /sticker_packs/1/13.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/13.webp -------------------------------------------------------------------------------- /sticker_packs/1/14.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/14.webp -------------------------------------------------------------------------------- /sticker_packs/1/15.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/15.webp -------------------------------------------------------------------------------- /sticker_packs/1/16.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/16.webp -------------------------------------------------------------------------------- /sticker_packs/1/17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/17.webp -------------------------------------------------------------------------------- /sticker_packs/1/18.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/18.webp -------------------------------------------------------------------------------- /sticker_packs/1/19.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/19.webp -------------------------------------------------------------------------------- /sticker_packs/1/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/2.webp -------------------------------------------------------------------------------- /sticker_packs/1/20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/20.webp -------------------------------------------------------------------------------- /sticker_packs/1/21.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/21.webp -------------------------------------------------------------------------------- /sticker_packs/1/22.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/22.webp -------------------------------------------------------------------------------- /sticker_packs/1/23.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/23.webp -------------------------------------------------------------------------------- /sticker_packs/1/24.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/24.webp -------------------------------------------------------------------------------- /sticker_packs/1/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/3.webp -------------------------------------------------------------------------------- /sticker_packs/1/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/4.webp -------------------------------------------------------------------------------- /sticker_packs/1/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/5.webp -------------------------------------------------------------------------------- /sticker_packs/1/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/6.webp -------------------------------------------------------------------------------- /sticker_packs/1/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/7.webp -------------------------------------------------------------------------------- /sticker_packs/1/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/8.webp -------------------------------------------------------------------------------- /sticker_packs/1/9.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/1/9.webp -------------------------------------------------------------------------------- /sticker_packs/2/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/1.png -------------------------------------------------------------------------------- /sticker_packs/2/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/1.webp -------------------------------------------------------------------------------- /sticker_packs/2/10.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/10.webp -------------------------------------------------------------------------------- /sticker_packs/2/11.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/11.webp -------------------------------------------------------------------------------- /sticker_packs/2/12.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/12.webp -------------------------------------------------------------------------------- /sticker_packs/2/13.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/13.webp -------------------------------------------------------------------------------- /sticker_packs/2/14.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/14.webp -------------------------------------------------------------------------------- /sticker_packs/2/15.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/15.webp -------------------------------------------------------------------------------- /sticker_packs/2/16.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/16.webp -------------------------------------------------------------------------------- /sticker_packs/2/17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/17.webp -------------------------------------------------------------------------------- /sticker_packs/2/18.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/18.webp -------------------------------------------------------------------------------- /sticker_packs/2/19.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/19.webp -------------------------------------------------------------------------------- /sticker_packs/2/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/2.webp -------------------------------------------------------------------------------- /sticker_packs/2/20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/20.webp -------------------------------------------------------------------------------- /sticker_packs/2/21.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/21.webp -------------------------------------------------------------------------------- /sticker_packs/2/22.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/22.webp -------------------------------------------------------------------------------- /sticker_packs/2/23.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/23.webp -------------------------------------------------------------------------------- /sticker_packs/2/24.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/24.webp -------------------------------------------------------------------------------- /sticker_packs/2/25.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/25.webp -------------------------------------------------------------------------------- /sticker_packs/2/26.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/26.webp -------------------------------------------------------------------------------- /sticker_packs/2/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/3.webp -------------------------------------------------------------------------------- /sticker_packs/2/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/4.webp -------------------------------------------------------------------------------- /sticker_packs/2/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/5.webp -------------------------------------------------------------------------------- /sticker_packs/2/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/6.webp -------------------------------------------------------------------------------- /sticker_packs/2/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/7.webp -------------------------------------------------------------------------------- /sticker_packs/2/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/8.webp -------------------------------------------------------------------------------- /sticker_packs/2/9.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/2/9.webp -------------------------------------------------------------------------------- /sticker_packs/3/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/1.png -------------------------------------------------------------------------------- /sticker_packs/3/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/1.webp -------------------------------------------------------------------------------- /sticker_packs/3/10.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/10.webp -------------------------------------------------------------------------------- /sticker_packs/3/11.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/11.webp -------------------------------------------------------------------------------- /sticker_packs/3/12.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/12.webp -------------------------------------------------------------------------------- /sticker_packs/3/13.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/13.webp -------------------------------------------------------------------------------- /sticker_packs/3/14.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/14.webp -------------------------------------------------------------------------------- /sticker_packs/3/15.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/15.webp -------------------------------------------------------------------------------- /sticker_packs/3/16.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/16.webp -------------------------------------------------------------------------------- /sticker_packs/3/17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/17.webp -------------------------------------------------------------------------------- /sticker_packs/3/18.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/18.webp -------------------------------------------------------------------------------- /sticker_packs/3/19.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/19.webp -------------------------------------------------------------------------------- /sticker_packs/3/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/2.webp -------------------------------------------------------------------------------- /sticker_packs/3/20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/20.webp -------------------------------------------------------------------------------- /sticker_packs/3/21.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/21.webp -------------------------------------------------------------------------------- /sticker_packs/3/22.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/22.webp -------------------------------------------------------------------------------- /sticker_packs/3/23.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/23.webp -------------------------------------------------------------------------------- /sticker_packs/3/24.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/24.webp -------------------------------------------------------------------------------- /sticker_packs/3/25.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/25.webp -------------------------------------------------------------------------------- /sticker_packs/3/26.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/26.webp -------------------------------------------------------------------------------- /sticker_packs/3/27.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/27.webp -------------------------------------------------------------------------------- /sticker_packs/3/28.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/28.webp -------------------------------------------------------------------------------- /sticker_packs/3/29.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/29.webp -------------------------------------------------------------------------------- /sticker_packs/3/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/3.webp -------------------------------------------------------------------------------- /sticker_packs/3/30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/30.webp -------------------------------------------------------------------------------- /sticker_packs/3/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/4.webp -------------------------------------------------------------------------------- /sticker_packs/3/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/5.webp -------------------------------------------------------------------------------- /sticker_packs/3/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/6.webp -------------------------------------------------------------------------------- /sticker_packs/3/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/7.webp -------------------------------------------------------------------------------- /sticker_packs/3/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/8.webp -------------------------------------------------------------------------------- /sticker_packs/3/9.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/3/9.webp -------------------------------------------------------------------------------- /sticker_packs/4/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/1.png -------------------------------------------------------------------------------- /sticker_packs/4/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/1.webp -------------------------------------------------------------------------------- /sticker_packs/4/10.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/10.webp -------------------------------------------------------------------------------- /sticker_packs/4/11.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/11.webp -------------------------------------------------------------------------------- /sticker_packs/4/12.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/12.webp -------------------------------------------------------------------------------- /sticker_packs/4/13.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/13.webp -------------------------------------------------------------------------------- /sticker_packs/4/14.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/14.webp -------------------------------------------------------------------------------- /sticker_packs/4/15.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/15.webp -------------------------------------------------------------------------------- /sticker_packs/4/16.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/16.webp -------------------------------------------------------------------------------- /sticker_packs/4/17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/17.webp -------------------------------------------------------------------------------- /sticker_packs/4/18.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/18.webp -------------------------------------------------------------------------------- /sticker_packs/4/19.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/19.webp -------------------------------------------------------------------------------- /sticker_packs/4/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/2.webp -------------------------------------------------------------------------------- /sticker_packs/4/20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/20.webp -------------------------------------------------------------------------------- /sticker_packs/4/21.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/21.webp -------------------------------------------------------------------------------- /sticker_packs/4/22.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/22.webp -------------------------------------------------------------------------------- /sticker_packs/4/23.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/23.webp -------------------------------------------------------------------------------- /sticker_packs/4/24.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/24.webp -------------------------------------------------------------------------------- /sticker_packs/4/25.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/25.webp -------------------------------------------------------------------------------- /sticker_packs/4/26.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/26.webp -------------------------------------------------------------------------------- /sticker_packs/4/27.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/27.webp -------------------------------------------------------------------------------- /sticker_packs/4/28.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/28.webp -------------------------------------------------------------------------------- /sticker_packs/4/29.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/29.webp -------------------------------------------------------------------------------- /sticker_packs/4/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/3.webp -------------------------------------------------------------------------------- /sticker_packs/4/30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/30.webp -------------------------------------------------------------------------------- /sticker_packs/4/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/4.webp -------------------------------------------------------------------------------- /sticker_packs/4/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/5.webp -------------------------------------------------------------------------------- /sticker_packs/4/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/6.webp -------------------------------------------------------------------------------- /sticker_packs/4/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/7.webp -------------------------------------------------------------------------------- /sticker_packs/4/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/8.webp -------------------------------------------------------------------------------- /sticker_packs/4/9.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/4/9.webp -------------------------------------------------------------------------------- /sticker_packs/5/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/1.png -------------------------------------------------------------------------------- /sticker_packs/5/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/1.webp -------------------------------------------------------------------------------- /sticker_packs/5/10.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/10.webp -------------------------------------------------------------------------------- /sticker_packs/5/11.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/11.webp -------------------------------------------------------------------------------- /sticker_packs/5/12.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/12.webp -------------------------------------------------------------------------------- /sticker_packs/5/13.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/13.webp -------------------------------------------------------------------------------- /sticker_packs/5/14.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/14.webp -------------------------------------------------------------------------------- /sticker_packs/5/15.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/15.webp -------------------------------------------------------------------------------- /sticker_packs/5/16.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/16.webp -------------------------------------------------------------------------------- /sticker_packs/5/17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/17.webp -------------------------------------------------------------------------------- /sticker_packs/5/18.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/18.webp -------------------------------------------------------------------------------- /sticker_packs/5/19.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/19.webp -------------------------------------------------------------------------------- /sticker_packs/5/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/2.webp -------------------------------------------------------------------------------- /sticker_packs/5/20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/20.webp -------------------------------------------------------------------------------- /sticker_packs/5/21.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/21.webp -------------------------------------------------------------------------------- /sticker_packs/5/22.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/22.webp -------------------------------------------------------------------------------- /sticker_packs/5/23.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/23.webp -------------------------------------------------------------------------------- /sticker_packs/5/24.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/24.webp -------------------------------------------------------------------------------- /sticker_packs/5/25.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/25.webp -------------------------------------------------------------------------------- /sticker_packs/5/26.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/26.webp -------------------------------------------------------------------------------- /sticker_packs/5/27.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/27.webp -------------------------------------------------------------------------------- /sticker_packs/5/28.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/28.webp -------------------------------------------------------------------------------- /sticker_packs/5/29.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/29.webp -------------------------------------------------------------------------------- /sticker_packs/5/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/3.webp -------------------------------------------------------------------------------- /sticker_packs/5/30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/30.webp -------------------------------------------------------------------------------- /sticker_packs/5/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/4.webp -------------------------------------------------------------------------------- /sticker_packs/5/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/5.webp -------------------------------------------------------------------------------- /sticker_packs/5/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/6.webp -------------------------------------------------------------------------------- /sticker_packs/5/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/7.webp -------------------------------------------------------------------------------- /sticker_packs/5/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/8.webp -------------------------------------------------------------------------------- /sticker_packs/5/9.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/5/9.webp -------------------------------------------------------------------------------- /sticker_packs/6/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/1.png -------------------------------------------------------------------------------- /sticker_packs/6/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/1.webp -------------------------------------------------------------------------------- /sticker_packs/6/10.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/10.webp -------------------------------------------------------------------------------- /sticker_packs/6/11.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/11.webp -------------------------------------------------------------------------------- /sticker_packs/6/12.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/12.webp -------------------------------------------------------------------------------- /sticker_packs/6/13.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/13.webp -------------------------------------------------------------------------------- /sticker_packs/6/14.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/14.webp -------------------------------------------------------------------------------- /sticker_packs/6/15.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/15.webp -------------------------------------------------------------------------------- /sticker_packs/6/16.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/16.webp -------------------------------------------------------------------------------- /sticker_packs/6/17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/17.webp -------------------------------------------------------------------------------- /sticker_packs/6/18.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/18.webp -------------------------------------------------------------------------------- /sticker_packs/6/19.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/19.webp -------------------------------------------------------------------------------- /sticker_packs/6/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/2.webp -------------------------------------------------------------------------------- /sticker_packs/6/20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/20.webp -------------------------------------------------------------------------------- /sticker_packs/6/21.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/21.webp -------------------------------------------------------------------------------- /sticker_packs/6/22.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/22.webp -------------------------------------------------------------------------------- /sticker_packs/6/23.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/23.webp -------------------------------------------------------------------------------- /sticker_packs/6/24.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/24.webp -------------------------------------------------------------------------------- /sticker_packs/6/25.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/25.webp -------------------------------------------------------------------------------- /sticker_packs/6/26.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/26.webp -------------------------------------------------------------------------------- /sticker_packs/6/27.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/27.webp -------------------------------------------------------------------------------- /sticker_packs/6/28.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/28.webp -------------------------------------------------------------------------------- /sticker_packs/6/29.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/29.webp -------------------------------------------------------------------------------- /sticker_packs/6/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/3.webp -------------------------------------------------------------------------------- /sticker_packs/6/30.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/30.webp -------------------------------------------------------------------------------- /sticker_packs/6/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/4.webp -------------------------------------------------------------------------------- /sticker_packs/6/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/5.webp -------------------------------------------------------------------------------- /sticker_packs/6/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/6.webp -------------------------------------------------------------------------------- /sticker_packs/6/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/7.webp -------------------------------------------------------------------------------- /sticker_packs/6/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/8.webp -------------------------------------------------------------------------------- /sticker_packs/6/9.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/6/9.webp -------------------------------------------------------------------------------- /sticker_packs/7/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/1.png -------------------------------------------------------------------------------- /sticker_packs/7/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/1.webp -------------------------------------------------------------------------------- /sticker_packs/7/10.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/10.webp -------------------------------------------------------------------------------- /sticker_packs/7/11.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/11.webp -------------------------------------------------------------------------------- /sticker_packs/7/12.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/12.webp -------------------------------------------------------------------------------- /sticker_packs/7/13.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/13.webp -------------------------------------------------------------------------------- /sticker_packs/7/14.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/14.webp -------------------------------------------------------------------------------- /sticker_packs/7/15.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/15.webp -------------------------------------------------------------------------------- /sticker_packs/7/16.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/16.webp -------------------------------------------------------------------------------- /sticker_packs/7/17.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/17.webp -------------------------------------------------------------------------------- /sticker_packs/7/18.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/18.webp -------------------------------------------------------------------------------- /sticker_packs/7/19.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/19.webp -------------------------------------------------------------------------------- /sticker_packs/7/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/2.webp -------------------------------------------------------------------------------- /sticker_packs/7/20.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/20.webp -------------------------------------------------------------------------------- /sticker_packs/7/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/3.webp -------------------------------------------------------------------------------- /sticker_packs/7/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/4.webp -------------------------------------------------------------------------------- /sticker_packs/7/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/5.webp -------------------------------------------------------------------------------- /sticker_packs/7/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/6.webp -------------------------------------------------------------------------------- /sticker_packs/7/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/7.webp -------------------------------------------------------------------------------- /sticker_packs/7/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/8.webp -------------------------------------------------------------------------------- /sticker_packs/7/9.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AkramChauhan/WhatsApp-Stickers-using-Flutter/bc47015f60800755ea05c04374f8dc19ca93d045/sticker_packs/7/9.webp -------------------------------------------------------------------------------- /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 in the flutter_test package. 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:trendy_whatsapp_stickers/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(const 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 | --------------------------------------------------------------------------------