├── .gitignore
├── .gradle
├── 5.1.1
│ ├── fileChanges
│ │ └── last-build.bin
│ ├── fileHashes
│ │ └── fileHashes.lock
│ └── gc.properties
├── buildOutputCleanup
│ ├── buildOutputCleanup.lock
│ └── cache.properties
└── vcs-1
│ └── gc.properties
├── .metadata
├── .travis.yml
├── README.md
├── android
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ ├── com
│ │ │ │ └── app
│ │ │ │ │ └── messio
│ │ │ │ │ └── messio
│ │ │ │ │ └── MainActivity.java
│ │ │ └── io
│ │ │ │ └── flutter
│ │ │ │ └── plugins
│ │ │ │ └── GeneratedPluginRegistrant.java
│ │ └── res
│ │ │ ├── drawable-hdpi
│ │ │ ├── ic_launcher_background.png
│ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable-mdpi
│ │ │ ├── ic_launcher_background.png
│ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable-xhdpi
│ │ │ ├── ic_launcher_background.png
│ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable-xxhdpi
│ │ │ ├── ic_launcher_background.png
│ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable-xxxhdpi
│ │ │ ├── ic_launcher_background.png
│ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ └── ic_launcher.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ └── values
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── settings.gradle
├── assets
├── fonts
│ ├── manrope-bold.otf
│ ├── manrope-extrabold.otf
│ ├── manrope-light.otf
│ ├── manrope-medium.otf
│ ├── manrope-regular.otf
│ ├── manrope-semibold.otf
│ └── manrope-thin.otf
├── google.png
├── launcher
│ ├── ic_background.png
│ ├── ic_foreground.png
│ └── ic_launcher.png
├── placeholder.png
├── social.png
└── user.png
├── howModalBottomSheet
├── lib
├── blocs
│ ├── attachments
│ │ ├── attachments_bloc.dart
│ │ ├── attachments_event.dart
│ │ ├── attachments_state.dart
│ │ └── bloc.dart
│ ├── authentication
│ │ ├── authentication_bloc.dart
│ │ ├── authentication_event.dart
│ │ ├── authentication_state.dart
│ │ └── bloc.dart
│ ├── chats
│ │ ├── bloc.dart
│ │ ├── chat_bloc.dart
│ │ ├── chat_event.dart
│ │ └── chat_state.dart
│ ├── config
│ │ ├── bloc.dart
│ │ ├── config_bloc.dart
│ │ ├── config_event.dart
│ │ └── config_state.dart
│ ├── contacts
│ │ ├── bloc.dart
│ │ ├── contacts_bloc.dart
│ │ ├── contacts_event.dart
│ │ └── contacts_state.dart
│ └── home
│ │ ├── bloc.dart
│ │ ├── home_bloc.dart
│ │ ├── home_event.dart
│ │ └── home_state.dart
├── config
│ ├── assets.dart
│ ├── constants.dart
│ ├── decorations.dart
│ ├── palette.dart
│ ├── paths.dart
│ ├── styles.dart
│ ├── themes.dart
│ └── transitions.dart
├── main.dart
├── models
│ ├── chat.dart
│ ├── contact.dart
│ ├── conversation.dart
│ ├── message.dart
│ ├── messio_user.dart
│ └── video_wrapper.dart
├── pages
│ ├── attachment_page.dart
│ ├── contact_list_page.dart
│ ├── conversation_page.dart
│ ├── conversation_page_slide.dart
│ ├── home_page.dart
│ ├── register_page.dart
│ ├── settings_page.dart
│ └── single_conversation_page.dart
├── providers
│ ├── authentication_provider.dart
│ ├── base_providers.dart
│ ├── chat_provider.dart
│ ├── storage_provider.dart
│ └── user_data_provider.dart
├── repositories
│ ├── authentication_repository.dart
│ ├── base_repository.dart
│ ├── chat_repository.dart
│ ├── storage_repository.dart
│ └── user_data_repository.dart
├── utils
│ ├── document_snapshot_extension.dart
│ ├── exceptions.dart
│ ├── shared_objects.dart
│ ├── validators.dart
│ └── video_thumbnail.dart
└── widgets
│ ├── bottom_sheet_fixed.dart
│ ├── chat_app_bar.dart
│ ├── chat_item_widget.dart
│ ├── chat_list_widget.dart
│ ├── chat_row_widget.dart
│ ├── circle_indicator.dart
│ ├── contact_row_widget.dart
│ ├── conversation_bottom_sheet.dart
│ ├── conversation_list_widget.dart
│ ├── gradient_fab.dart
│ ├── gradient_snack_bar.dart
│ ├── image_full_screen_widget.dart
│ ├── input_widget.dart
│ ├── navigation_pill_widget.dart
│ ├── number_picker.dart
│ ├── quick_scroll_bar.dart
│ └── video_player_widget.dart
├── pubspec.lock
├── pubspec.yaml
├── server
├── .gitignore
├── firebase.json
├── firestore.indexes.json
├── firestore.rules
└── functions
│ ├── .gitignore
│ ├── package-lock.json
│ ├── package.json
│ ├── src
│ └── index.ts
│ ├── tsconfig.json
│ └── tslint.json
└── test
├── blocs
└── authentication_bloc_test.dart
├── main_test.dart
├── mock
├── data_mock.dart
├── firebase_mock.dart
├── io_mock.dart
├── repository_mock.dart
└── shared_objects_mock.dart
├── pages
├── conversation_page_slide_test.dart
└── conversation_page_test.dart
├── providers
├── authentication_provider_test.dart
├── chat_provider_test.dart
├── storage_provider_test.dart
└── user_data_provider_test.dart
└── widgets
├── chat_app_bar_test.dart
├── chat_item_widget_test.dart
├── chat_list_widget_test.dart
└── input_widget_test.dart
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .flutter-plugins-dependencies
8 | .atom/
9 | .buildlog/
10 | .history
11 | .svn/
12 |
13 | # IntelliJ related
14 | *.iml
15 | *.ipr
16 | *.iws
17 | .idea/
18 |
19 | # The .vscode folder contains launch configuration and tasks you configure in
20 | # VS Code which you may wish to be included in version control, so this line
21 | # is commented out by default.
22 | #.vscode/
23 |
24 | # Flutter/Dart/Pub related
25 | **/doc/api/
26 | .dart_tool/
27 | .flutter-plugins
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | #Platform specific
34 | /android/app/google-services.json
35 | /android/**/gradle-wrapper.jar
36 | /android/.gradle
37 | /android/captures/
38 | /android/gradlew
39 | /android/gradlew.bat
40 | /android/local.properties
41 | /android/**/GeneratedPluginRegistrant.java
42 | /android/keystore.properties
43 | /ios/
44 |
45 | #Firebase setup related
46 | /server/.firebaserc
47 | /android/.gradle/
48 |
--------------------------------------------------------------------------------
/.gradle/5.1.1/fileChanges/last-build.bin:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gradle/5.1.1/fileHashes/fileHashes.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/.gradle/5.1.1/fileHashes/fileHashes.lock
--------------------------------------------------------------------------------
/.gradle/5.1.1/gc.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/.gradle/5.1.1/gc.properties
--------------------------------------------------------------------------------
/.gradle/buildOutputCleanup/buildOutputCleanup.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/.gradle/buildOutputCleanup/buildOutputCleanup.lock
--------------------------------------------------------------------------------
/.gradle/buildOutputCleanup/cache.properties:
--------------------------------------------------------------------------------
1 | #Mon Aug 19 00:34:07 IST 2019
2 | gradle.version=5.1.1
3 |
--------------------------------------------------------------------------------
/.gradle/vcs-1/gc.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/.gradle/vcs-1/gc.properties
--------------------------------------------------------------------------------
/.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: b712a172f9694745f50505c93340883493b505e5
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: dart
2 | dist: bionic
3 | addons:
4 | apt:
5 | packages:
6 | - lib32stdc++6
7 | install:
8 | - git clone https://github.com/flutter/flutter.git -b stable --depth 1
9 | - export PATH=./flutter/bin:$PATH
10 | - flutter doctor
11 | - flutter --version
12 | script:
13 | - flutter packages get
14 | - flutter analyze --no-pub --no-current-package lib/ test/
15 | - flutter test --no-pub test/
16 | cache:
17 | directories:
18 | - $HOME/.pub-cache
19 | - $HOME/.pub-cache
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | 
3 | # Messio
4 | An open source messenger app built using flutter.
5 |
6 | Part of Medium Series [60 days of Flutter](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-from-scratch-ab2c89e1fd0f) written by [Aditya Gurjar](https://medium.com/@adityadroid)
7 |
8 | ### Posts In This Series
9 |
10 | [60 Days Of Flutter : Building a Messenger from Scratch](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-from-scratch-ab2c89e1fd0f)
11 |
12 | [60 Days of Flutter : Day 1 : Creating the App](https://medium.com/@adityadroid/60-days-of-flutter-creating-the-app-ea0407b472ae)
13 |
14 | [60 Days of Flutter : Day 2 : Setting Up A CI With Flutter](https://medium.com/@adityadroid/60-days-of-flutter-day-2-setting-up-a-ci-with-flutter-8f77bebd1b86)
15 |
16 | [60 Days of Flutter : Day 3–4 : Building a Chat Screen in Flutter](https://medium.com/@adityadroid/60-days-of-flutter-day-3-4-building-a-chat-screen-in-flutter-e2ed36388dc7?sk=da6cf57f149fa2d61d481cb2f93edde4)
17 |
18 | [60 Days of Flutter : Day 4–5 : Widget Testing With Flutter](https://medium.com/@adityadroid/60-days-of-flutter-day-4-5-widget-testing-with-flutter-a30236dd04fc?sk=50feba54f4cf238b2422f72ce3da01f0)
19 |
20 | [60 Days of Flutter : Day 6–7 : Implementing a Slideable Widget Using Bottomsheet in Flutter](https://medium.com/@adityadroid/60-days-of-flutter-day-6-7-implementing-a-slideable-widget-using-bottomsheet-in-flutter-c320dc106f2b?sk=18ddb63ed2fb69dfc90d6aa8f4ac574f)
21 |
22 | [60 Days of Flutter : Day 8 : Changing The Launcher Icon and Implementing GestureDetector](https://medium.com/@adityadroid/60-days-of-flutter-day-8-changing-the-launcher-icon-and-implementing-gesturedetector-421a00ad854a)
23 |
24 | [60 Days of Flutter : Day 9–10–11 : Creating Awesome Register Screen in Flutter](https://medium.com/@adityadroid/60-days-of-flutter-day-9-10-11-creating-awesome-register-screen-in-flutter-77db27227c07)
25 |
26 | [60 Days of Flutter : Day 12–14 : Understanding BLoC Pattern in Flutter](https://medium.com/@adityadroid/60-days-of-flutter-day-12-14-understanding-bloc-pattern-in-flutter-8703486f716d)
27 |
28 | [60 Days of Flutter : Day 15–17 : Implementing Registration Screen using ‘flutter_bloc’](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-15-17-implementing-registration-screen-using-d3a708d866a9)
29 |
30 | [60 Days of Flutter : Day 18–19 : Unit Testing in Flutter using ‘ mockito’](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-18-19-unit-testing-in-flutter-using-mockito-8bafd7445dd8)
31 |
32 | [60 Days of Flutter : Day 20–21 : Unit Testing a Bloc in Flutter](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-18-19-unit-testing-a-bloc-in-flutter-61e3c58918a2)
33 |
34 | [60 Days of Flutter : Day 22–23 : Building a Modern Contacts Page in Flutter](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-22-23-building-a-modern-contacts-page-in-flutter-9f3cfd01d08d)
35 |
36 | [60 Days of Flutter : Day 24–26 : Building a Animated Progress Fab and the Contacts Bloc in Flutter](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-24-26-building-a-animated-progress-fab-and-the-bf28c59b8472)
37 |
38 | [60 Days of Flutter : Day 27–29 : Sending and Retrieving Messages from Firebase using BLOC](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-27-29-sending-and-retrieving-messages-from-e44135c8e95f)
39 |
40 | [60 Days of Flutter : Day 30–32 : Firebase Chat UI using Stream and Bloc](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-30-32-firebase-chat-ui-using-stream-and-bloc-5d0e5f3e914b)
41 |
42 | [60 Days of Flutter : Day 33–35 : Paginating data from Firestore using Firebase Queries](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-33-35-paginating-data-from-firestore-using-2391b90e8cda)
43 |
44 | [60 Days of Flutter : Day 36–38 : Seamlessly Upload Files to Firebase Storage](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-36-38-chat-attachments-seamlessly-upload-and-8d334a4e52b5)
45 |
46 | [60 Days of Flutter : Day 39–41 : One UI Inspired Attachments Showcase Page](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-39-41-one-ui-inspired-attachments-showcase-page-5962af007ab4)
47 |
48 | [60 Days of Flutter : Day 42–44 : Creating the Home Page & Quick Peek BottomSheet for Messages](https://medium.com/@adityadroid/60-days-of-flutter-building-a-messenger-day-42-45-creating-the-home-page-quick-peek-7264bc68e86d)
49 |
50 | Happy learning. :+1:
51 |
52 | ### Show some :heart: and star the repo to support the project
53 |
54 | [](https://github.com/adityadroid/messio) [](https://github.com/adityadroid/messio/fork) [](https://github.com/adityadroid/messio) [](https://github.com/adityadroid/messio)
55 | [](https://twitter.com/adityadroid)
56 |
57 |
58 |
59 | ### :heart: Found this project useful?
60 |
61 | If you found this project useful, then please consider giving it a :star: on Github and sharing it with your friends via social media.
62 |
63 | ## Project Created & Maintained By
64 |
65 | ### Aditya Gurjar
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 | # Donate
74 |
75 | > If you found this project helpful or you learned something from the source code and want to thank me, consider buying me a cup of :coffee:
76 | >
77 | > - [PayPal](https://www.paypal.me/adityadroid/)
78 |
--------------------------------------------------------------------------------
/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 from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
26 |
27 | android {
28 | compileSdkVersion 28
29 |
30 | lintOptions {
31 | disable 'InvalidPackage'
32 | }
33 |
34 | defaultConfig {
35 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
36 | applicationId "com.app.messio.messio"
37 | minSdkVersion 19
38 | targetSdkVersion 33
39 | compileSdkVersion 33
40 | versionCode flutterVersionCode.toInteger()
41 | versionName flutterVersionName
42 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
43 | multiDexEnabled true
44 | }
45 |
46 | buildTypes {
47 | release {
48 | // TODO: Add your own signing config for the release build.
49 | // Signing with the debug keys for now, so `flutter run --release` works.
50 | signingConfig signingConfigs.debug
51 | }
52 | debug {
53 | minifyEnabled false
54 | useProguard false
55 | }
56 | }
57 | }
58 |
59 | flutter {
60 | source '../..'
61 | }
62 |
63 | dependencies {
64 | testImplementation 'junit:junit:4.12'
65 | androidTestImplementation 'androidx.test:runner:1.2.0'
66 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
67 | implementation 'androidx.multidex:multidex:2.0.1'
68 |
69 | }
70 | apply plugin: 'com.google.gms.google-services' // Google Play services Gradle plugin
71 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
9 |
13 |
21 |
25 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
37 |
42 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/app/messio/messio/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.app.messio.messio;
2 |
3 | import android.graphics.Bitmap;
4 | import android.media.MediaMetadataRetriever;
5 | import android.os.AsyncTask;
6 | import android.os.Bundle;
7 | import android.util.Log;
8 | import java.io.IOException;
9 | import java.io.ByteArrayOutputStream;
10 | import java.io.FileOutputStream;
11 | import java.util.HashMap;
12 | import java.util.Map;
13 |
14 | import io.flutter.plugins.GeneratedPluginRegistrant;
15 | import androidx.annotation.NonNull;
16 | import io.flutter.plugin.common.MethodChannel;
17 | import io.flutter.embedding.android.FlutterActivity;
18 | import io.flutter.embedding.engine.FlutterEngine;
19 | import io.flutter.plugins.GeneratedPluginRegistrant;
20 |
21 | public class MainActivity extends FlutterActivity {
22 | private static String TAG = "Android Platform";
23 | private static final int HIGH_QUALITY_MIN_VAL = 70;
24 | @Override
25 | public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
26 | GeneratedPluginRegistrant.registerWith(flutterEngine);
27 | new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "app.messio.channel").setMethodCallHandler(
28 | (call, result) -> {
29 | final Map args = call.arguments();
30 |
31 | try {
32 | final String video = (String) args.get("video");
33 | final int format = (int) args.get("format");
34 | final int maxhow = (int) args.get("maxhow");
35 | final int quality = (int) args.get("quality");
36 | new Thread(() -> {
37 | if (call.method.equals("file")) {
38 | final String path = (String) args.get("path");
39 | String data = buildThumbnailFile(video, path, format, maxhow, quality);
40 | runOnUiThread(()-> result.success(data));
41 | } else if (call.method.equals("data")) {
42 | byte[] data = buildThumbnailData(video, format, maxhow, quality);
43 | runOnUiThread(()-> result.success(data));
44 | } else {
45 | runOnUiThread(result::notImplemented);
46 | }
47 | }).start();
48 |
49 | } catch (Exception e) {
50 | e.printStackTrace();
51 | result.error("exception", e.getMessage(), null);
52 | }
53 | });
54 | }
55 |
56 | private static Bitmap.CompressFormat intToFormat(int format) {
57 | switch (format) {
58 | default:
59 | case 0:
60 | return Bitmap.CompressFormat.JPEG;
61 | case 1:
62 | return Bitmap.CompressFormat.PNG;
63 | case 2:
64 | return Bitmap.CompressFormat.WEBP;
65 | }
66 | }
67 |
68 | private static String formatExt(int format) {
69 | switch (format) {
70 | default:
71 | case 0:
72 | return "jpg";
73 | case 1:
74 | return "png";
75 | case 2:
76 | return "webp";
77 | }
78 | }
79 |
80 | private byte[] buildThumbnailData(String vidPath, int format, int maxhow, int quality) {
81 | Log.d(TAG, String.format("buildThumbnailData( format:%d, maxhow:%d, quality:%d )", format, maxhow, quality));
82 | Bitmap bitmap = createVideoThumbnail(vidPath, maxhow);
83 | if (bitmap == null)
84 | throw new NullPointerException();
85 |
86 | ByteArrayOutputStream stream = new ByteArrayOutputStream();
87 | bitmap.compress(intToFormat(format), quality, stream);
88 | bitmap.recycle();
89 | if (bitmap == null)
90 | throw new NullPointerException();
91 | return stream.toByteArray();
92 | }
93 |
94 | private String buildThumbnailFile(String vidPath, String path, int format, int maxhow, int quality) {
95 | Log.d(TAG, String.format("buildThumbnailFile( format:%d, maxhow:%d, quality:%d )", format, maxhow, quality));
96 | final byte bytes[] = buildThumbnailData(vidPath, format, maxhow, quality);
97 | final String ext = formatExt(format);
98 | final int i = vidPath.lastIndexOf(".");
99 | String fullpath = vidPath.substring(0, i + 1) + ext;
100 |
101 | if (path != null) {
102 | if (path.endsWith(ext)) {
103 | fullpath = path;
104 | } else {
105 | // try to save to same folder as the vidPath
106 | final int j = fullpath.lastIndexOf("/");
107 |
108 | if (path.endsWith("/")) {
109 | fullpath = path + fullpath.substring(j + 1);
110 | } else {
111 | fullpath = path + fullpath.substring(j);
112 | }
113 | }
114 | }
115 |
116 | try {
117 | FileOutputStream f = new FileOutputStream(fullpath);
118 | f.write(bytes);
119 | f.close();
120 | Log.d(TAG, String.format("buildThumbnailFile( written:%d )", bytes.length));
121 | } catch (java.io.IOException e) {
122 | e.getStackTrace();
123 | throw new RuntimeException(e);
124 | }
125 | return fullpath;
126 | }
127 |
128 | /**
129 | * Create a video thumbnail for a video. May return null if the video is corrupt
130 | * or the format is not supported.
131 | *
132 | * @param video the URI of video
133 | * @param targetSize max width or height of the thumbnail
134 | */
135 | public static Bitmap createVideoThumbnail(String video, int targetSize) {
136 | Bitmap bitmap = null;
137 | MediaMetadataRetriever retriever = new MediaMetadataRetriever();
138 | try {
139 | Log.d(TAG, String.format("setDataSource: %s )", video));
140 | if (video.startsWith("file://") || video.startsWith("/")) {
141 | retriever.setDataSource(video);
142 | } else {
143 | retriever.setDataSource(video, new HashMap());
144 | }
145 | bitmap = retriever.getFrameAtTime(-1);
146 | } catch (IllegalArgumentException ex) {
147 | ex.printStackTrace();
148 | } catch (RuntimeException ex) {
149 | ex.printStackTrace();
150 | } finally {
151 | try {
152 | retriever.release();
153 | } catch (IOException ex) {
154 | ex.printStackTrace();
155 | } catch (RuntimeException ex) {
156 | ex.printStackTrace();
157 | }
158 | }
159 |
160 | if (bitmap == null)
161 | return null;
162 |
163 | if (targetSize != 0) {
164 | int width = bitmap.getWidth();
165 | int height = bitmap.getHeight();
166 | int max = Math.max(width, height);
167 | float scale = (float) targetSize / max;
168 | int w = Math.round(scale * width);
169 | int h = Math.round(scale * height);
170 | Log.d(TAG, String.format("original w:%d, h:%d, scale:%6.4f => %d, %d", width, height, scale, w, h));
171 | bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true);
172 | }
173 | return bitmap;
174 | }
175 | }
176 |
--------------------------------------------------------------------------------
/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java:
--------------------------------------------------------------------------------
1 | package io.flutter.plugins;
2 |
3 | import androidx.annotation.Keep;
4 | import androidx.annotation.NonNull;
5 | import io.flutter.Log;
6 |
7 | import io.flutter.embedding.engine.FlutterEngine;
8 | import io.flutter.embedding.engine.plugins.shim.ShimPluginRegistry;
9 |
10 | /**
11 | * Generated file. Do not edit.
12 | * This file is generated by the Flutter tool based on the
13 | * plugins that support the Android platform.
14 | */
15 | @Keep
16 | public final class GeneratedPluginRegistrant {
17 | private static final String TAG = "GeneratedPluginRegistrant";
18 | public static void registerWith(@NonNull FlutterEngine flutterEngine) {
19 | ShimPluginRegistry shimPluginRegistry = new ShimPluginRegistry(flutterEngine);
20 | try {
21 | flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.firestore.FlutterFirebaseFirestorePlugin());
22 | } catch(Exception e) {
23 | Log.e(TAG, "Error registering plugin cloud_firestore, io.flutter.plugins.firebase.firestore.FlutterFirebaseFirestorePlugin", e);
24 | }
25 | try {
26 | it.nplace.downloadspathprovider.DownloadsPathProviderPlugin.registerWith(shimPluginRegistry.registrarFor("it.nplace.downloadspathprovider.DownloadsPathProviderPlugin"));
27 | } catch(Exception e) {
28 | Log.e(TAG, "Error registering plugin downloads_path_provider, it.nplace.downloadspathprovider.DownloadsPathProviderPlugin", e);
29 | }
30 | try {
31 | flutterEngine.getPlugins().add(new com.jeffg.emoji_picker.EmojiPickerPlugin());
32 | } catch(Exception e) {
33 | Log.e(TAG, "Error registering plugin emoji_picker, com.jeffg.emoji_picker.EmojiPickerPlugin", e);
34 | }
35 | try {
36 | flutterEngine.getPlugins().add(new com.mr.flutter.plugin.filepicker.FilePickerPlugin());
37 | } catch(Exception e) {
38 | Log.e(TAG, "Error registering plugin file_picker, com.mr.flutter.plugin.filepicker.FilePickerPlugin", e);
39 | }
40 | try {
41 | flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.auth.FlutterFirebaseAuthPlugin());
42 | } catch(Exception e) {
43 | Log.e(TAG, "Error registering plugin firebase_auth, io.flutter.plugins.firebase.auth.FlutterFirebaseAuthPlugin", e);
44 | }
45 | try {
46 | flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin());
47 | } catch(Exception e) {
48 | Log.e(TAG, "Error registering plugin firebase_core, io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin", e);
49 | }
50 | try {
51 | flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.storage.FlutterFirebaseStoragePlugin());
52 | } catch(Exception e) {
53 | Log.e(TAG, "Error registering plugin firebase_storage, io.flutter.plugins.firebase.storage.FlutterFirebaseStoragePlugin", e);
54 | }
55 | try {
56 | flutterEngine.getPlugins().add(new vn.hunghd.flutterdownloader.FlutterDownloaderPlugin());
57 | } catch(Exception e) {
58 | Log.e(TAG, "Error registering plugin flutter_downloader, vn.hunghd.flutterdownloader.FlutterDownloaderPlugin", e);
59 | }
60 | try {
61 | flutterEngine.getPlugins().add(new io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin());
62 | } catch(Exception e) {
63 | Log.e(TAG, "Error registering plugin flutter_plugin_android_lifecycle, io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin", e);
64 | }
65 | try {
66 | flutterEngine.getPlugins().add(new io.flutter.plugins.googlesignin.GoogleSignInPlugin());
67 | } catch(Exception e) {
68 | Log.e(TAG, "Error registering plugin google_sign_in_android, io.flutter.plugins.googlesignin.GoogleSignInPlugin", e);
69 | }
70 | try {
71 | flutterEngine.getPlugins().add(new io.flutter.plugins.imagepicker.ImagePickerPlugin());
72 | } catch(Exception e) {
73 | Log.e(TAG, "Error registering plugin image_picker, io.flutter.plugins.imagepicker.ImagePickerPlugin", e);
74 | }
75 | try {
76 | flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin());
77 | } catch(Exception e) {
78 | Log.e(TAG, "Error registering plugin path_provider_android, io.flutter.plugins.pathprovider.PathProviderPlugin", e);
79 | }
80 | try {
81 | flutterEngine.getPlugins().add(new io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin());
82 | } catch(Exception e) {
83 | Log.e(TAG, "Error registering plugin shared_preferences, io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin", e);
84 | }
85 | try {
86 | flutterEngine.getPlugins().add(new com.tekartik.sqflite.SqflitePlugin());
87 | } catch(Exception e) {
88 | Log.e(TAG, "Error registering plugin sqflite, com.tekartik.sqflite.SqflitePlugin", e);
89 | }
90 | try {
91 | flutterEngine.getPlugins().add(new io.flutter.plugins.videoplayer.VideoPlayerPlugin());
92 | } catch(Exception e) {
93 | Log.e(TAG, "Error registering plugin video_player_android, io.flutter.plugins.videoplayer.VideoPlayerPlugin", e);
94 | }
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/drawable-mdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/drawable-xhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/drawable-xxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | repositories {
3 | google()
4 | jcenter()
5 | }
6 |
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:4.2.0'
9 | classpath 'com.google.gms:google-services:4.3.3'
10 | }
11 | }
12 |
13 | allprojects {
14 | repositories {
15 | google()
16 | jcenter()
17 | }
18 | }
19 |
20 | rootProject.buildDir = '../build'
21 | subprojects {
22 | project.buildDir = "${rootProject.buildDir}/${project.name}"
23 | }
24 | subprojects {
25 | project.evaluationDependsOn(':app')
26 | }
27 | subprojects {
28 |
29 | }
30 |
31 | task clean(type: Delete) {
32 | delete rootProject.buildDir
33 | }
34 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/android/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue Jun 16 15:59:50 ICT 2020
2 | distributionBase=GRADLE_USER_HOME
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-all.zip
4 | distributionPath=wrapper/dists
5 | zipStorePath=wrapper/dists
6 | zipStoreBase=GRADLE_USER_HOME
7 |
--------------------------------------------------------------------------------
/android/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/android/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/android/local.properties:
--------------------------------------------------------------------------------
1 | sdk.dir=/Users/adityadroid/Library/Android/sdk
2 | flutter.sdk=/Users/adityadroid/Development/flutter
3 | flutter.buildMode=debug
4 | flutter.versionName=1.0.0
5 | flutter.versionCode=1
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/assets/fonts/manrope-bold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/fonts/manrope-bold.otf
--------------------------------------------------------------------------------
/assets/fonts/manrope-extrabold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/fonts/manrope-extrabold.otf
--------------------------------------------------------------------------------
/assets/fonts/manrope-light.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/fonts/manrope-light.otf
--------------------------------------------------------------------------------
/assets/fonts/manrope-medium.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/fonts/manrope-medium.otf
--------------------------------------------------------------------------------
/assets/fonts/manrope-regular.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/fonts/manrope-regular.otf
--------------------------------------------------------------------------------
/assets/fonts/manrope-semibold.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/fonts/manrope-semibold.otf
--------------------------------------------------------------------------------
/assets/fonts/manrope-thin.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/fonts/manrope-thin.otf
--------------------------------------------------------------------------------
/assets/google.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/google.png
--------------------------------------------------------------------------------
/assets/launcher/ic_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/launcher/ic_background.png
--------------------------------------------------------------------------------
/assets/launcher/ic_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/launcher/ic_foreground.png
--------------------------------------------------------------------------------
/assets/launcher/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/launcher/ic_launcher.png
--------------------------------------------------------------------------------
/assets/placeholder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/placeholder.png
--------------------------------------------------------------------------------
/assets/social.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/social.png
--------------------------------------------------------------------------------
/assets/user.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/adityadroid/Messio/d65473b7f91d1cf7ac09c6b4c9fe35ad08febd29/assets/user.png
--------------------------------------------------------------------------------
/howModalBottomSheet:
--------------------------------------------------------------------------------
1 | ChatBloc[m
2 | ChatList[m
3 | ContactBloc[m
4 | ContactList[m
5 | Conversation-Attachment[m
6 | ConversationUI[m
7 | ConversationUI-Patch[m
8 | ConversationUI-Test[m
9 | * [32mDarkTheme[m
10 | HomePage[m
11 | ReadmePatch[m
12 | RegisterUI[m
13 | Registration-Bloc[m
14 | Registration-Test[m
15 | Travis-CI[m
16 | init[m
17 | master[m
18 |
--------------------------------------------------------------------------------
/lib/blocs/attachments/attachments_bloc.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'dart:io';
3 | import 'package:bloc/bloc.dart';
4 | import 'package:file_picker/file_picker.dart';
5 | import 'package:messio/models/message.dart';
6 | import 'package:messio/models/video_wrapper.dart';
7 | import 'package:messio/repositories/chat_repository.dart';
8 | import 'package:messio/utils/shared_objects.dart';
9 | import './bloc.dart';
10 |
11 | class AttachmentsBloc extends Bloc {
12 | final ChatRepository chatRepository;
13 |
14 | AttachmentsBloc({this.chatRepository}) :super(InitialAttachmentsState()){
15 | assert(chatRepository != null);
16 | on(mapFetchAttachmentsEventToState);
17 | }
18 |
19 | Future mapFetchAttachmentsEventToState(
20 | FetchAttachmentsEvent event, Emitter emit) async {
21 | int type = SharedObjects.getTypeFromFileType(event.fileType);
22 | List attachments =
23 | await chatRepository.getAttachments(event.chatId, type);
24 | if (event.fileType != FileType.video) {
25 | emit(FetchedAttachmentsState(event.fileType, attachments));
26 | } else {
27 | List videos = List();
28 | for(Message message in attachments){
29 | if (message is VideoMessage) {
30 | File file = await SharedObjects.getThumbnail(message.videoUrl);
31 | videos.add(VideoWrapper(file, message));
32 | }
33 | }
34 | emit(FetchedVideosState(videos));
35 | }
36 | }
37 |
38 | FutureOr> parseVideos(List attachments) async{
39 | List videos = List();
40 | for(Message message in attachments){
41 | if (message is VideoMessage) {
42 | File file = await SharedObjects.getThumbnail(message.videoUrl);
43 | videos.add(VideoWrapper(file, message));
44 | }
45 | }
46 | return videos;
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/lib/blocs/attachments/attachments_event.dart:
--------------------------------------------------------------------------------
1 | import 'package:equatable/equatable.dart';
2 | import 'package:file_picker/file_picker.dart';
3 | import 'package:meta/meta.dart';
4 |
5 | @immutable
6 | abstract class AttachmentsEvent extends Equatable {
7 | AttachmentsEvent([List props = const []]);
8 |
9 | @override
10 | List