├── .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 | 
4 |
5 | # Available in PlayStore
6 |
7 | 
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 |
--------------------------------------------------------------------------------