├── .envrc ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ └── feature_request.yml ├── pull_request_template.md └── workflows │ ├── build.yaml │ ├── gh-pages.yaml │ ├── image.yaml │ ├── integration-tests.yaml │ ├── release.yaml │ └── tests.yaml ├── .gitignore ├── .gitlab-ci.yml ├── .mailmap ├── .metadata ├── CHANGELOG.md ├── Dockerfile ├── LICENSE ├── PRIVACY.md ├── README.md ├── TRANSLATORS_GUIDE.md ├── analysis_options.yaml ├── android ├── .gitignore ├── Gemfile ├── Gemfile.lock ├── app │ ├── build.gradle │ ├── google-services.json │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── app │ │ │ └── twake │ │ │ └── android │ │ │ └── chat │ │ │ └── MainActivityTest.java │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── ic_launcher-playstore.png │ │ ├── kotlin │ │ │ └── app │ │ │ │ └── twake │ │ │ │ └── android │ │ │ │ └── chat │ │ │ │ ├── FcmPushService.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ └── UnifiedPushService.kt │ │ └── res │ │ │ ├── drawable-anydpi-v24 │ │ │ └── notifications_icon.xml │ │ │ ├── drawable-hdpi │ │ │ ├── branding.png │ │ │ └── splash.png │ │ │ ├── drawable-mdpi │ │ │ ├── branding.png │ │ │ └── splash.png │ │ │ ├── drawable-v21 │ │ │ ├── background.png │ │ │ └── launch_background.xml │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable-xhdpi │ │ │ ├── branding.png │ │ │ └── splash.png │ │ │ ├── drawable-xxhdpi │ │ │ ├── branding.png │ │ │ └── splash.png │ │ │ ├── drawable-xxxhdpi │ │ │ ├── branding.png │ │ │ └── splash.png │ │ │ ├── drawable │ │ │ ├── background.png │ │ │ ├── ic_launcher_background.xml │ │ │ ├── launch_background.xml │ │ │ └── notifications_icon.png │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── values-night-v31 │ │ │ └── styles.xml │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ ├── values-v31 │ │ │ └── styles.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── fastlane │ ├── Appfile │ ├── Fastfile │ ├── README.md │ ├── metadata │ │ └── android │ │ │ └── en-US │ │ │ ├── changelogs │ │ │ ├── 2324 (1.6.0).txt │ │ │ └── 50 (0.22.1).txt │ │ │ ├── full_description.txt │ │ │ ├── images │ │ │ ├── featureGraphic.png │ │ │ └── icon.png │ │ │ ├── short_description.txt │ │ │ ├── title.txt │ │ │ └── video.txt │ └── report.xml ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties └── settings.gradle ├── appimage ├── .gitignore ├── AppImageBuilder.yml ├── AppRun ├── FluffyChat.desktop └── README.md ├── assets ├── backup.png ├── blur.png ├── branding.png ├── colors.png ├── favicon.png ├── google_fonts │ ├── Inter-Bold.ttf │ ├── Inter-Medium.ttf │ ├── Inter-Regular.ttf │ └── Inter-SemiBold.ttf ├── icons │ └── icon_launcher.png ├── images │ ├── app_store.svg │ ├── google_play.svg │ ├── ic_add.svg │ ├── ic_add_file.svg │ ├── ic_application_grid.svg │ ├── ic_done.svg │ ├── ic_emoji.svg │ ├── ic_empty_group_chat.svg │ ├── ic_empty_page.svg │ ├── ic_empty_search.svg │ ├── ic_encrypted.svg │ ├── ic_error_page.svg │ ├── ic_error_page_background.svg │ ├── ic_file_audio.svg │ ├── ic_file_doc.svg │ ├── ic_file_error.svg │ ├── ic_file_excel.svg │ ├── ic_file_folder.svg │ ├── ic_file_image.svg │ ├── ic_file_pdf.svg │ ├── ic_file_ppt.svg │ ├── ic_file_unknown.svg │ ├── ic_file_video.svg │ ├── ic_file_word.svg │ ├── ic_file_zip.svg │ ├── ic_goto.svg │ ├── ic_jump_to.svg │ ├── ic_keyboard.svg │ ├── ic_matrixid.svg │ ├── ic_no_results_found.svg │ ├── ic_person_check.svg │ ├── ic_phone_call.svg │ ├── ic_photos_setting.svg │ ├── ic_reply.svg │ ├── ic_send.svg │ ├── ic_send_status.svg │ ├── ic_sending.svg │ ├── ic_shield_lock_fill.svg │ ├── ic_show_in_chat.svg │ ├── ic_skeletons.svg │ ├── ic_status.svg │ ├── ic_twake_image_beta.svg │ ├── ic_twake_image_logo.svg │ ├── ic_twake_logo.svg │ ├── ic_unpin.svg │ ├── ic_users_outline.svg │ ├── ic_video_call.svg │ ├── ic_voice_message.svg │ ├── logo_twake_welcome.svg │ └── search_emoji_empty.svg ├── info-logo.png ├── js │ └── package │ │ └── .gitkeep ├── l10n │ ├── intl_ar.arb │ ├── intl_ca.arb │ ├── intl_cs.arb │ ├── intl_de.arb │ ├── intl_en.arb │ ├── intl_eo.arb │ ├── intl_es.arb │ ├── intl_et.arb │ ├── intl_eu.arb │ ├── intl_fa.arb │ ├── intl_fi.arb │ ├── intl_fr.arb │ ├── intl_ga.arb │ ├── intl_gl.arb │ ├── intl_he.arb │ ├── intl_hr.arb │ ├── intl_hu.arb │ ├── intl_id.arb │ ├── intl_ie.arb │ ├── intl_it.arb │ ├── intl_ja.arb │ ├── intl_ko.arb │ ├── intl_lt.arb │ ├── intl_nb.arb │ ├── intl_nl.arb │ ├── intl_pl.arb │ ├── intl_pt.arb │ ├── intl_pt_BR.arb │ ├── intl_pt_PT.arb │ ├── intl_ro.arb │ ├── intl_ru.arb │ ├── intl_sk.arb │ ├── intl_sl.arb │ ├── intl_sr.arb │ ├── intl_sv.arb │ ├── intl_tr.arb │ ├── intl_uk.arb │ ├── intl_vi.arb │ ├── intl_zh.arb │ └── intl_zh_Hant.arb ├── logo.png ├── logo.svg ├── sas-emoji.json ├── share.png ├── sounds │ ├── WoodenBeaver_stereo_message-new-instant.ogg │ ├── call.ogg │ └── phone.ogg ├── twake.svg ├── twake_loading.json ├── typing-indicator.zip └── verification.png ├── config.sample.json ├── configurations ├── app_dashboard.json ├── icons │ ├── ic_twake_calendar.svg │ ├── ic_twake_chat.svg │ ├── ic_twake_contacts.svg │ ├── ic_twake_drive.svg │ ├── ic_twake_mail.svg │ ├── ic_twake_support.svg │ └── ic_twake_visio.svg └── nginx.conf.template ├── docs ├── LICENSE ├── OFL.txt ├── ZenKurenaido-Regular.ttf ├── adr │ ├── 0001-record-architecture-decisions.md │ ├── 0002-parse-pushnotification-error.md │ ├── 0003-improve-for-load-image-first-time.md │ ├── 0004-cannot-get-current-location-and-current-context.md │ ├── 0005-matrix-sdk-receipts-not-working-properly.md │ ├── 0006-dom-exception-error-when-delete-disk-for-web.md │ ├── 0007-implement-search-in-chat-room.md │ ├── 0008-apply-dio-cache-interceptor.md │ ├── 0009-Instructions-for-naming-twake-events.md │ ├── 0010-upgrade-gradle-build-to-7-3-0.md │ ├── 0011-workaround-for-ios-force-user-relogin.md │ ├── 0012-improve-ios-notification.md │ ├── 0013-refactor-message-widget.md │ ├── 0014-find-to-last-read-message.md │ ├── 0015-get-server-config.md │ ├── 0016-sticky-timestamp-inside-chat.md │ ├── 0017-remove-set-state-for-reply-message.md │ ├── 0018-show-in-chat-of-media-functionality.md │ ├── 0019-change-the-way-log-in-SSO-in-web.md │ ├── 0020-keyboard-is-disappeared-then-appeared.md │ ├── 0021--chat-message-bubbles-width.md │ ├── 0022-listen-to-presence-status.md │ ├── 0023-upgrade-flutter-3.22.md │ ├── 0024-cancel-upload-file-with-caption.md │ ├── 0024-upgrade-flutter-3.24.md │ ├── 0025-add-patrol-integration-tests.md │ ├── 0025-improve-tag-suggesstion-and-dispay-members-in-group-chat-detail.md │ └── memory_leak_tracking │ │ ├── 0001-dispose-valuenotifier-when-not-used.md │ │ ├── 0002-cancel-stream-subscription-when-not-used.md │ │ └── 0003-do-not-set-null-to-variable-after-cancel.md ├── appstore-badge.png ├── bg.svg ├── browser-badge.png ├── code_style.md ├── configurations │ ├── app_grid_configuration.md │ ├── config_build_mobile_app_for_public_platform.md │ ├── config_web_app_for_public_platform.md │ └── configure_push_gateway.md ├── en │ └── privacy.html ├── favicon.png ├── fdroid_button.png ├── fdroid_repo.md ├── firefox_icon.png ├── flathub-badge-en.png ├── google-play-badge.png ├── how_to_fork.md ├── index.html ├── kofi_button_dark.png ├── qr-nightly.svg ├── qr-stable.svg ├── screenshots │ ├── desktop.png │ ├── mobile.png │ ├── product.jpeg │ ├── screenshots.png │ ├── showcase1.jpeg │ ├── showcase2.jpeg │ ├── showcase3.jpeg │ ├── showcase4.jpeg │ └── showcase5.jpeg ├── tailwind.config.js └── tailwind.css ├── fastlane ├── fdroid ├── .gitignore ├── config.nightly.py ├── config.stable.py ├── fdroid-icon.png └── metadata │ └── chat.fluffy.fluffychat.yml ├── flake.lock ├── flake.nix ├── integration_test ├── .gitignore ├── base │ ├── base_scenario.dart │ ├── core_robot.dart │ └── test_base.dart ├── dendrite │ └── data │ │ └── dendrite.yaml ├── extensions │ ├── default_flows.dart │ └── wait_for.dart ├── robots │ └── login_robot.dart ├── scenarios │ └── login_scenario.dart ├── synapse │ └── data │ │ ├── homeserver.yaml │ │ ├── localhost.log.config │ │ └── localhost.signing.key ├── tests │ └── login │ │ └── login_test.dart └── users.dart ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Gemfile ├── Gemfile.lock ├── NSE │ ├── AttributedString.swift │ ├── AvatarSize.swift │ ├── BackgroundTaskProtocol.swift │ ├── BackgroundTaskServiceProtocol.swift │ ├── Bundle.swift │ ├── Date.swift │ ├── DesignKit │ │ ├── Package.resolved │ │ ├── Package.swift │ │ ├── Sources │ │ │ ├── Buttons │ │ │ │ ├── ElementActionButtonStyle.swift │ │ │ │ ├── ElementCapsuleButtonStyle.swift │ │ │ │ └── ElementGhostButtonStyle.swift │ │ │ ├── Colors │ │ │ │ └── ElementColors.swift │ │ │ ├── Common │ │ │ │ └── ElementControlSize.swift │ │ │ ├── Shapes │ │ │ │ └── RoundedCornerShape.swift │ │ │ └── TextFields │ │ │ │ └── ElementTextFieldStyle.swift │ │ └── Tests │ │ │ └── DesignKitTests.swift │ ├── FileManager.swift │ ├── Generated │ │ ├── Assets.swift │ │ ├── Strings+Untranslated.swift │ │ └── Strings.swift │ ├── HTMLParsing │ │ ├── AttributedStringBuilder.swift │ │ ├── AttributedStringBuilderProtocol.swift │ │ ├── DTHTMLElement+AttributedStringBuilder.swift │ │ ├── ElementXAttributeScope.swift │ │ ├── UIFont+AttributedStringBuilder.h │ │ └── UIFont+AttributedStringBuilder.m │ ├── ImageCache.swift │ ├── Info.plist │ ├── InfoPlistReader.swift │ ├── KeychainController.swift │ ├── KeychainControllerProtocol.swift │ ├── LayoutDirection.swift │ ├── Logging │ │ ├── MXLog.swift │ │ ├── MXLogger.swift │ │ └── RustTracing.swift │ ├── MatrixEntityRegex.swift │ ├── NSE.entitlements │ ├── NSRegularExpresion.swift │ ├── NotificationConstants.swift │ ├── PermalinkBuilder.swift │ ├── PlaceholderAvatarImage.swift │ ├── Provider │ │ ├── ImageProviderProtocol.swift │ │ ├── MediaFileHandleProxy.swift │ │ ├── MediaLoader.swift │ │ ├── MediaLoaderProtocol.swift │ │ ├── MediaProvider.swift │ │ ├── MediaProviderProtocol.swift │ │ ├── MediaSourceProxy.swift │ │ └── MockMediaProvider.swift │ ├── Proxy │ │ ├── NotificationItemProxy.swift │ │ └── NotificationItemProxyProtocol.swift │ ├── RestorationToken.swift │ ├── RoomMessageEventStringBuilder.swift │ ├── SharedUserDefaultsKeys.swift │ ├── Sources │ │ ├── NotificationContentBuilder.swift │ │ ├── NotificationServiceExtension.swift │ │ └── Other │ │ │ ├── DataProtectionManager.swift │ │ │ ├── NSELogger.swift │ │ │ ├── NSESettings.swift │ │ │ ├── NSEUserSession.swift │ │ │ └── UNNotificationRequest.swift │ ├── String.swift │ ├── Task.swift │ ├── TestablePreview.swift │ ├── UNNotificationContent.swift │ ├── URL.swift │ ├── UTType.swift │ ├── UserAgentBuilder.swift │ └── UserPreference.swift ├── Podfile ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ ├── NSE.xcscheme │ │ ├── Runner.xcscheme │ │ └── TwakeShareExtension.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ ├── WorkspaceSettings.xcsettings │ │ └── swiftpm │ │ └── Package.resolved ├── 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-50x50@1x.png │ │ │ ├── Icon-App-50x50@2x.png │ │ │ ├── Icon-App-57x57@1x.png │ │ │ ├── Icon-App-57x57@2x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-72x72@1x.png │ │ │ ├── Icon-App-72x72@2x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ ├── BrandingImage.imageset │ │ │ ├── BrandingImage.png │ │ │ ├── BrandingImage@2x.png │ │ │ ├── BrandingImage@3x.png │ │ │ └── Contents.json │ │ ├── LaunchBackground.imageset │ │ │ ├── Contents.json │ │ │ └── background.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── GoogleService-Info.plist │ ├── Info.plist │ ├── Runner-Bridging-Header.h │ ├── Runner.entitlements │ ├── ar.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── ca.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── cs.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── de.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── en.lproj │ │ ├── Localizable.strings │ │ └── Localizable.stringsdict │ ├── eo.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── es.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── et.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── eu.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── fr.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ ├── Localizable.stringsdict │ │ └── Main.strings │ ├── gl.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── hr-HR.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── hu-HU.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── hu.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── hy.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── it.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── ja.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── nb-NO.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── pl.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── pt.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── ru-RU.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ ├── Localizable.stringsdict │ │ └── Main.strings │ ├── sk-SK.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── sv-SE.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── tr.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── uk.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ ├── vi-VN.lproj │ │ ├── LaunchScreen.strings │ │ ├── Localizable.strings │ │ └── Main.strings │ └── zh-Hans.lproj │ │ ├── LaunchScreen.strings │ │ └── Main.strings ├── TwakeShareExtension │ ├── Base.lproj │ │ └── MainInterface.storyboard │ ├── Info.plist │ ├── ShareViewController.swift │ └── TwakeShareExtension.entitlements └── fastlane │ ├── Appfile │ ├── Fastfile │ ├── Matchfile │ ├── README.md │ └── report.xml ├── l10n.yaml ├── lib ├── app_state │ ├── failure.dart │ ├── initial.dart │ ├── success.dart │ └── success_converter.dart ├── config │ ├── app_config.dart │ ├── app_emojis.dart │ ├── app_grid_config │ │ ├── app_config_loader.dart │ │ ├── app_config_parser.dart │ │ └── app_grid_errors.dart │ ├── config_saas │ │ └── config_saas.dart │ ├── default_power_level_member.dart │ ├── first_column_inner_routes.dart │ ├── go_routes │ │ ├── go_router.dart │ │ └── router_arguments.dart │ ├── isrg_x1.dart │ ├── localizations │ │ ├── language_code_constants.dart │ │ └── localization_service.dart │ ├── setting_keys.dart │ └── themes.dart ├── data │ ├── datasource │ │ ├── contact │ │ │ ├── address_book_datasource.dart │ │ │ ├── hive_third_party_contact_datasource.dart │ │ │ └── phonebook_datasource.dart │ │ ├── federation_configurations_datasource.dart │ │ ├── invitation │ │ │ ├── hive_invitation_status_datasource.dart │ │ │ └── invitation_datasource.dart │ │ ├── localizations │ │ │ └── localizations_datasource.dart │ │ ├── media │ │ │ └── media_data_source.dart │ │ ├── multiple_account │ │ │ └── multiple_account_datasource.dart │ │ ├── reactions │ │ │ └── reactions_datasource.dart │ │ ├── recovery_words_data_source.dart │ │ ├── server_config_datasource.dart │ │ ├── server_search_datasource.dart │ │ ├── tom_configurations_datasource.dart │ │ └── tom_contacts_datasource.dart │ ├── datasource_impl │ │ ├── contact │ │ │ ├── address_book_datasource_impl.dart │ │ │ ├── hive_third_party_contact_datasource_impl.dart │ │ │ ├── phonebook_contact_datasource_impl.dart │ │ │ └── tom_contacts_datasource_impl.dart │ │ ├── federation_configurations_datasource_impl.dart │ │ ├── invitation │ │ │ ├── hive_invitation_status_datasource_impl.dart │ │ │ └── invitation_datasource_impl.dart │ │ ├── localizations │ │ │ └── localizations_datasource_impl.dart │ │ ├── media │ │ │ └── media_data_source_impl.dart │ │ ├── multiple_account │ │ │ └── multiple_account_datasource_impl.dart │ │ ├── reactions │ │ │ └── reactions_datasource_impl.dart │ │ ├── recovery_words_data_source_impl.dart │ │ ├── server_config_datasource_impl.dart │ │ ├── server_search_datasource_impl.dart │ │ └── tom_configurations_datasource_impl.dart │ ├── extensions │ │ └── media │ │ │ └── url_preview_response_extension.dart │ ├── hive │ │ ├── dto │ │ │ ├── contact │ │ │ │ ├── contact_hive_obj.dart │ │ │ │ └── third_party_contact_hive_obj.dart │ │ │ ├── federation_configurations_hive_obj.dart │ │ │ ├── federation_server_information_hive_obj.dart │ │ │ ├── invitation_status │ │ │ │ └── invitation_status_hive_obj.dart │ │ │ ├── tom_configurations_hive_obj.dart │ │ │ └── tom_server_information_hive_obj.dart │ │ ├── extension │ │ │ ├── contact_hive_obj_extension.dart │ │ │ └── invitation_status_hive_obj_extension.dart │ │ └── hive_collection_tom_database.dart │ ├── local │ │ ├── contact │ │ │ ├── enum │ │ │ │ ├── chunk_federation_contact_error_enum.dart │ │ │ │ ├── contacts_hive_error_enum.dart │ │ │ │ └── contacts_vault_error_enum.dart │ │ │ └── shared_preferences_contact_cache_manager.dart │ │ ├── localizations │ │ │ └── language_cache_manager.dart │ │ ├── multiple_account │ │ │ └── multiple_account_cache_manager.dart │ │ └── reaction │ │ │ └── reaction_cache_manager.dart │ ├── model │ │ ├── addressbook │ │ │ ├── address_book.dart │ │ │ ├── address_book_request.dart │ │ │ └── address_book_response.dart │ │ ├── federation_server │ │ │ ├── federation_configuration.dart │ │ │ └── federation_server_information.dart │ │ ├── invitation │ │ │ ├── generate_invitation_link_response.dart │ │ │ ├── invitation_request.dart │ │ │ ├── invitation_status_response.dart │ │ │ └── send_invitation_response.dart │ │ ├── media │ │ │ ├── download_file_response.dart │ │ │ ├── upload_file_json.dart │ │ │ └── url_preview_response.dart │ │ ├── recovery_words_json.dart │ │ └── search │ │ │ ├── server_search_request.dart │ │ │ └── server_search_response.dart │ ├── network │ │ ├── contact │ │ │ ├── address_book_api.dart │ │ │ └── tom_contact_api.dart │ │ ├── dio_cache_option.dart │ │ ├── dio_client.dart │ │ ├── exception │ │ │ └── dio_duplicate_download_exception.dart │ │ ├── extensions │ │ │ ├── file_info_extension.dart │ │ │ └── options_extensions.dart │ │ ├── homeserver_endpoint.dart │ │ ├── identity_endpoint.dart │ │ ├── interceptor │ │ │ ├── authorization_interceptor.dart │ │ │ ├── download_file_interceptor.dart │ │ │ ├── dynamic_url_interceptor.dart │ │ │ └── matrix_dio_cache_interceptor.dart │ │ ├── invitation │ │ │ └── invitation_api.dart │ │ ├── media │ │ │ ├── cancel_exception.dart │ │ │ └── media_api.dart │ │ ├── recovery_words │ │ │ └── recovery_words_api.dart │ │ ├── search │ │ │ └── server_search_api.dart │ │ ├── server_config_api.dart │ │ ├── service_path.dart │ │ ├── status_error_code.dart │ │ └── tom_endpoint.dart │ └── repository │ │ ├── contact │ │ ├── address_book_repository_impl.dart │ │ ├── hive_third_party_contact_repository_impl.dart │ │ ├── phonebook_contact_repository_impl.dart │ │ └── tom_contact_repository_impl.dart │ │ ├── federation_configurations_repository_impl.dart │ │ ├── invitation │ │ ├── hive_invitation_status_repository_impl.dart │ │ └── invitation_repository_impl.dart │ │ ├── localizations │ │ └── localizations_repository_impl.dart │ │ ├── media │ │ └── media_repository_impl.dart │ │ ├── multiple_account │ │ └── multiple_account_repository_impl.dart │ │ ├── reactions │ │ └── reactions_repository_impl.dart │ │ ├── recovery_words_repository_impl.dart │ │ ├── server_config_repository_impl.dart │ │ ├── server_search_repository_impl.dart │ │ └── tom_configurations_repository_impl.dart ├── di │ ├── base_di.dart │ └── global │ │ ├── dio_cache_interceptor_for_client.dart │ │ ├── get_it_initializer.dart │ │ ├── hive_di.dart │ │ ├── network_connectivity_di.dart │ │ └── network_di.dart ├── domain │ ├── app_state │ │ ├── app_grid │ │ │ └── get_app_grid_configuration_state.dart │ │ ├── contact │ │ │ ├── delete_third_party_contact_box_state.dart │ │ │ ├── get_address_book_state.dart │ │ │ ├── get_contacts_state.dart │ │ │ ├── get_phonebook_contact_state.dart │ │ │ ├── lookup_match_contact_state.dart │ │ │ ├── post_address_book_state.dart │ │ │ └── try_get_synced_phone_book_contact_state.dart │ │ ├── direct_chat │ │ │ ├── create_direct_chat_failed.dart │ │ │ ├── create_direct_chat_loading.dart │ │ │ └── create_direct_chat_success.dart │ │ ├── download │ │ │ └── download_file_state.dart │ │ ├── forward │ │ │ └── forward_message_state.dart │ │ ├── invitation │ │ │ ├── generate_invitation_link_state.dart │ │ │ ├── get_invitation_status_state.dart │ │ │ ├── hive_delete_invitation_status_state.dart │ │ │ ├── hive_get_invitation_status_state.dart │ │ │ ├── send_invitation_state.dart │ │ │ └── store_invitation_status_state.dart │ │ ├── localizations │ │ │ └── save_language_state.dart │ │ ├── preview_file │ │ │ ├── download_file_for_preview_failure.dart │ │ │ ├── download_file_for_preview_loading.dart │ │ │ └── download_file_for_preview_success.dart │ │ ├── preview_url │ │ │ ├── get_preview_url_failure.dart │ │ │ ├── get_preview_url_loading.dart │ │ │ └── get_preview_url_success.dart │ │ ├── recovery_words │ │ │ ├── delete_recovery_states.dart │ │ │ ├── get_recovery_words_failed.dart │ │ │ ├── get_recovery_words_success.dart │ │ │ ├── save_recovery_words_failed.dart │ │ │ └── save_recovery_words_success.dart │ │ ├── room │ │ │ ├── chat_get_pinned_events_state.dart │ │ │ ├── chat_room_search_state.dart │ │ │ ├── create_new_group_chat_state.dart │ │ │ ├── delete_event_state.dart │ │ │ ├── timeline_search_event_state.dart │ │ │ ├── update_group_chat_failure.dart │ │ │ ├── update_group_chat_loading.dart │ │ │ ├── update_group_chat_success.dart │ │ │ ├── update_pinned_events_state.dart │ │ │ └── upload_content_state.dart │ │ ├── search │ │ │ ├── pre_search_state.dart │ │ │ ├── search_state.dart │ │ │ └── server_search_state.dart │ │ ├── send_file_dialog │ │ │ └── generate_thumbnails_media_state.dart │ │ ├── send_files │ │ │ ├── send_files_failed.dart │ │ │ ├── send_files_loading.dart │ │ │ ├── send_files_loading_with_placeholder.dart │ │ │ └── send_files_success.dart │ │ ├── settings │ │ │ ├── update_profile_failure.dart │ │ │ ├── update_profile_loading.dart │ │ │ └── update_profile_success.dart │ │ └── validator │ │ │ └── verify_name_view_state.dart │ ├── contact_manager │ │ └── contacts_manager.dart │ ├── enums │ │ └── pinned_messages_action_enum.dart │ ├── exception │ │ ├── contacts │ │ │ └── twake_lookup_exceptions.dart │ │ ├── federation_configuration_not_found.dart │ │ ├── invitation │ │ │ └── invitation_status_not_found.dart │ │ ├── room │ │ │ ├── can_not_create_new_group_chat_exception.dart │ │ │ └── can_not_upload_content_exception.dart │ │ ├── tom_configuration_not_found.dart │ │ └── verify_name_exception.dart │ ├── keychain_sharing │ │ ├── keychain_sharing_manager.dart │ │ ├── keychain_sharing_restore_token.dart │ │ └── keychain_sharing_session.dart │ ├── model │ │ ├── app_grid │ │ │ ├── app_grid_configuration_parser.dart │ │ │ ├── linagora_app.dart │ │ │ └── linagora_applications.dart │ │ ├── contact │ │ │ ├── contact.dart │ │ │ ├── contact_query.dart │ │ │ ├── contact_status.dart │ │ │ ├── contact_type.dart │ │ │ ├── federation_identity_register_response.dart │ │ │ ├── lookup_mxid_request.dart │ │ │ ├── lookup_mxid_response.dart │ │ │ ├── third_party_status.dart │ │ │ └── tom_contact.dart │ │ ├── download_file │ │ │ └── download_file_for_preview_response.dart │ │ ├── extensions │ │ │ ├── contact │ │ │ │ ├── address_book_extension.dart │ │ │ │ ├── contact_extension.dart │ │ │ │ └── tom_contact_extension.dart │ │ │ ├── homeserver_summary_extensions.dart │ │ │ ├── invitation │ │ │ │ └── invitation_extension.dart │ │ │ ├── linagora_app_extensions.dart │ │ │ ├── list_validator_extension.dart │ │ │ ├── platform_file │ │ │ │ └── platform_file_extension.dart │ │ │ ├── push │ │ │ │ └── push_notification_extension.dart │ │ │ ├── search │ │ │ │ └── contact_search_extension.dart │ │ │ ├── string_extension.dart │ │ │ └── validator_failure_extension.dart │ │ ├── invitation │ │ │ ├── invitation_medium_enum.dart │ │ │ └── invitation_status.dart │ │ ├── media │ │ │ └── url_preview.dart │ │ ├── preview_file │ │ │ ├── document_uti.dart │ │ │ └── supported_preview_file_types.dart │ │ ├── query.dart │ │ ├── recovery_words │ │ │ └── recovery_words.dart │ │ ├── room │ │ │ ├── create_new_group_chat_request.dart │ │ │ ├── room_extension.dart │ │ │ └── room_list_extension.dart │ │ ├── search │ │ │ ├── contact_search_model.dart │ │ │ ├── recent_chat_model.dart │ │ │ ├── search_model.dart │ │ │ └── server_side_search_categories.dart │ │ ├── tom_configurations.dart │ │ ├── tom_server_information.dart │ │ └── verification │ │ │ ├── composite_name_validator.dart │ │ │ ├── empty_name_validator.dart │ │ │ ├── name_with_space_only_validator.dart │ │ │ ├── new_name_request.dart │ │ │ └── validator.dart │ ├── repository │ │ ├── contact │ │ │ ├── address_book_repository.dart │ │ │ └── hive_contact_repository.dart │ │ ├── contact_repository.dart │ │ ├── federation_configurations_repository.dart │ │ ├── invitation │ │ │ ├── hive_invitation_status_repository.dart │ │ │ └── invitation_repository.dart │ │ ├── localizations │ │ │ └── localizations_repository.dart │ │ ├── media │ │ │ └── media_repository.dart │ │ ├── multiple_account │ │ │ └── multiple_account_repository.dart │ │ ├── phonebook_contact_repository.dart │ │ ├── reactions │ │ │ └── reactions_repository.dart │ │ ├── recovery_words_repository.dart │ │ ├── server_config_repository.dart │ │ ├── server_search_repository.dart │ │ └── tom_configurations_repository.dart │ └── usecase │ │ ├── app_grid │ │ └── get_app_grid_configuration_interactor.dart │ │ ├── contacts │ │ ├── delete_third_party_contact_box_interactor.dart │ │ ├── federation_look_up_argument.dart │ │ ├── federation_look_up_phonebook_contact_interactor.dart │ │ ├── get_address_book_interactor.dart │ │ ├── get_tom_contacts_interactor.dart │ │ ├── lookup_match_contact_interactor.dart │ │ ├── post_address_book_interactor.dart │ │ ├── try_get_synced_phone_book_contact_interactor.dart │ │ ├── twake_look_up_argument.dart │ │ └── twake_look_up_phonebook_contact_interactor.dart │ │ ├── create_direct_chat_interactor.dart │ │ ├── download_file_for_preview_interactor.dart │ │ ├── forward │ │ └── forward_message_interactor.dart │ │ ├── generate_thumbnails_media_interactor.dart │ │ ├── invitation │ │ ├── constants.dart │ │ ├── generate_invitation_link_interactor.dart │ │ ├── get_invitation_status_interactor.dart │ │ ├── hive_delete_invitation_status_interactor.dart │ │ ├── hive_get_invitation_status_interactor.dart │ │ ├── send_invitation_interactor.dart │ │ └── store_invitation_status_interactor.dart │ │ ├── lazy_load_interactor.dart │ │ ├── preview_url │ │ └── get_preview_url_interactor.dart │ │ ├── reactions │ │ ├── get_recent_reactions_interactor.dart │ │ └── store_recent_reactions_interactor.dart │ │ ├── recovery │ │ ├── delete_recovery_words_interactor.dart │ │ ├── get_recovery_words_interactor.dart │ │ └── save_recovery_words_interactor.dart │ │ ├── room │ │ ├── chat_get_pinned_events_interactor.dart │ │ ├── chat_room_search_interactor.dart │ │ ├── create_new_group_chat_interactor.dart │ │ ├── delete_event_interactor.dart │ │ ├── download_media_file_interactor.dart │ │ ├── timeline_search_event_interactor.dart │ │ ├── update_group_chat_interactor.dart │ │ ├── update_pinned_messages_interactor.dart │ │ ├── upload_content_for_web_interactor.dart │ │ └── upload_content_interactor.dart │ │ ├── search │ │ ├── pre_search_recent_contacts_interactor.dart │ │ ├── search_recent_chat_interactor.dart │ │ └── server_search_interactor.dart │ │ ├── settings │ │ ├── save_language_interactor.dart │ │ └── update_profile_interactor.dart │ │ └── verify_name_interactor.dart ├── event │ ├── twake_event_dispatcher.dart │ ├── twake_event_messages.dart │ ├── twake_event_types.dart │ └── twake_inapp_event_types.dart ├── main.dart ├── migrate_steps │ ├── migrate_steps.dart │ └── migrate_v6_to_v7 │ │ └── migrate_v6_to_v7.dart ├── modules │ ├── federation_identity_lookup │ │ ├── data │ │ │ ├── datasource │ │ │ │ └── federation_identity_lookup_datasource.dart │ │ │ ├── datasource_impl │ │ │ │ └── federation_identity_lookup_datasource_impl.dart │ │ │ ├── network │ │ │ │ ├── federation_identity_endpoint.dart │ │ │ │ └── federation_identity_lookup_api.dart │ │ │ └── repository_impl │ │ │ │ └── federation_identity_lookup_repository_impl.dart │ │ ├── domain │ │ │ ├── exceptions │ │ │ │ └── federation_identity_lookup_exceptions.dart │ │ │ ├── models │ │ │ │ ├── federation_arguments.dart │ │ │ │ ├── federation_contact.dart │ │ │ │ ├── federation_hash_details_response.dart │ │ │ │ ├── federation_lookup_mxid_request.dart │ │ │ │ ├── federation_lookup_mxid_response.dart │ │ │ │ ├── federation_register_response.dart │ │ │ │ └── federation_third_party_contact.dart │ │ │ ├── repository │ │ │ │ └── federation_identity_lookup_repository.dart │ │ │ ├── state │ │ │ │ └── federation_identity_lookup_state.dart │ │ │ └── usecase │ │ │ │ └── federation_identity_lookup_interactor.dart │ │ └── manager │ │ │ ├── federation_identity_lookup_manager.dart │ │ │ └── identity_lookup_manager.dart │ └── federation_identity_request_token │ │ ├── data │ │ ├── datasource │ │ │ └── federation_identity_request_token_datasource.dart │ │ ├── datasource_impl │ │ │ └── federation_identity_request_token_datasource_impl.dart │ │ ├── network │ │ │ ├── federation_identity_request_token_api.dart │ │ │ └── federation_identity_request_token_endpoint.dart │ │ └── repository │ │ │ └── federation_identity_request_token_repository_impl.dart │ │ ├── domain │ │ ├── models │ │ │ ├── federation_token_information.dart │ │ │ └── federation_token_request.dart │ │ ├── repository │ │ │ └── federation_identity_request_token_repository.dart │ │ ├── state │ │ │ └── federation_identity_request_token_state.dart │ │ └── usecase │ │ │ └── federation_identity_request_token_interactor.dart │ │ └── manager │ │ └── federation_identity_request_token_manager.dart ├── pages │ ├── add_story │ │ ├── add_story.dart │ │ ├── add_story_view.dart │ │ └── invite_story_page.dart │ ├── app_grid │ │ ├── app_grid_dashboard_controller.dart │ │ ├── app_grid_dashboard_item.dart │ │ ├── app_grid_dashboard_item_style.dart │ │ ├── app_grid_dashboard_overlay.dart │ │ ├── app_grid_dashboard_overlay_style.dart │ │ ├── app_grid_dashboard_view.dart │ │ └── app_grid_dashboard_view_style.dart │ ├── archive │ │ ├── archive.dart │ │ └── archive_view.dart │ ├── auto_homeserver_picker │ │ ├── auto_homeserver_picker.dart │ │ ├── auto_homeserver_picker_state.dart │ │ ├── auto_homeserver_picker_view.dart │ │ └── auto_homeserver_picker_view_style.dart │ ├── bootstrap │ │ ├── bootstrap_dialog.dart │ │ ├── init_client_dialog.dart │ │ ├── tom_bootstrap_dialog.dart │ │ ├── tom_bootstrap_dialog_mobile_style.dart │ │ ├── tom_bootstrap_dialog_mobile_view.dart │ │ ├── tom_bootstrap_dialog_style.dart │ │ └── tom_bootstrap_dialog_web_view.dart │ ├── chat │ │ ├── add_widget_tile.dart │ │ ├── add_widget_tile_view.dart │ │ ├── chat.dart │ │ ├── chat_actions.dart │ │ ├── chat_actions_style.dart │ │ ├── chat_app_bar_title.dart │ │ ├── chat_app_bar_title_style.dart │ │ ├── chat_context_menu_actions.dart │ │ ├── chat_event_list.dart │ │ ├── chat_horizontal_action_menu.dart │ │ ├── chat_input_row.dart │ │ ├── chat_input_row_mobile.dart │ │ ├── chat_input_row_send_btn.dart │ │ ├── chat_input_row_style.dart │ │ ├── chat_input_row_web.dart │ │ ├── chat_invitation_body.dart │ │ ├── chat_invitation_body_style.dart │ │ ├── chat_loading_view.dart │ │ ├── chat_loading_view_style.dart │ │ ├── chat_pinned_events │ │ │ ├── bottom_menu │ │ │ │ ├── bottom_menu_mobile.dart │ │ │ │ └── bottom_menu_web.dart │ │ │ ├── pinned_events_argument.dart │ │ │ ├── pinned_events_controller.dart │ │ │ ├── pinned_events_style.dart │ │ │ ├── pinned_events_view.dart │ │ │ ├── pinned_messages.dart │ │ │ ├── pinned_messages_screen.dart │ │ │ └── pinned_messages_style.dart │ │ ├── chat_view.dart │ │ ├── chat_view_body.dart │ │ ├── chat_view_body_style.dart │ │ ├── chat_view_style.dart │ │ ├── command_hints.dart │ │ ├── context_item_chat_action.dart │ │ ├── cupertino_widgets_bottom_sheet.dart │ │ ├── dialog_reject_invite_style.dart │ │ ├── dialog_reject_invite_widget.dart │ │ ├── disabled_chat_input_row.dart │ │ ├── disabled_chat_input_row_style.dart │ │ ├── edit_widgets_dialog.dart │ │ ├── event_info_dialog.dart │ │ ├── events │ │ │ ├── audio_player.dart │ │ │ ├── button_content.dart │ │ │ ├── button_content_style.dart │ │ │ ├── call_invite_content.dart │ │ │ ├── cute_events.dart │ │ │ ├── download_video_state.dart │ │ │ ├── download_video_widget.dart │ │ │ ├── encrypted_content.dart │ │ │ ├── encrypted_mixin.dart │ │ │ ├── event_video_player.dart │ │ │ ├── formatted_text_widget.dart │ │ │ ├── html_message.dart │ │ │ ├── images_builder │ │ │ │ ├── image_bubble.dart │ │ │ │ ├── image_builder_web.dart │ │ │ │ ├── image_placeholder.dart │ │ │ │ ├── message_content_image_builder.dart │ │ │ │ ├── sending_image_info_widget.dart │ │ │ │ └── unencrypted_image_builder_web.dart │ │ │ ├── map_bubble.dart │ │ │ ├── message │ │ │ │ ├── display_name_widget.dart │ │ │ │ ├── message.dart │ │ │ │ ├── message_content_builder.dart │ │ │ │ ├── message_content_builder_mixin.dart │ │ │ │ ├── message_content_with_timestamp_builder.dart │ │ │ │ ├── message_context_menu_action.dart │ │ │ │ ├── message_style.dart │ │ │ │ ├── multi_platform_message_container.dart │ │ │ │ ├── reply_content_widget.dart │ │ │ │ ├── reply_icon_widget.dart │ │ │ │ └── swipeable_message.dart │ │ │ ├── message_content.dart │ │ │ ├── message_content_mixin.dart │ │ │ ├── message_content_style.dart │ │ │ ├── message_download_content.dart │ │ │ ├── message_download_content_web.dart │ │ │ ├── message_reactions.dart │ │ │ ├── message_reactions_bottom_sheet.dart │ │ │ ├── message_reactions_style.dart │ │ │ ├── message_time.dart │ │ │ ├── message_time_style.dart │ │ │ ├── message_upload_content.dart │ │ │ ├── message_video_download_content.dart │ │ │ ├── message_video_download_content_web.dart │ │ │ ├── message_video_upload_content.dart │ │ │ ├── redacted_content.dart │ │ │ ├── reply_content.dart │ │ │ ├── reply_content_style.dart │ │ │ ├── sending_video_widget.dart │ │ │ ├── state_message.dart │ │ │ ├── sticker.dart │ │ │ ├── unknown_content.dart │ │ │ └── verification_request_content.dart │ │ ├── group_chat_empty_view.dart │ │ ├── input_bar │ │ │ ├── context_menu_input_bar.dart │ │ │ ├── focus_suggestion_controller.dart │ │ │ ├── focus_suggestion_list.dart │ │ │ ├── input_bar.dart │ │ │ ├── input_bar_shortcut.dart │ │ │ └── input_bar_style.dart │ │ ├── item_actions_bottom_widget.dart │ │ ├── others_group_chat_empty_view.dart │ │ ├── phone_number_context_menu_actions.dart │ │ ├── recording_dialog.dart │ │ ├── reply_display.dart │ │ ├── reply_display_style.dart │ │ ├── seen_by_row.dart │ │ ├── send_file_dialog │ │ │ ├── files_listview_widget.dart │ │ │ ├── hover_actions_widget.dart │ │ │ ├── media_page_view_widget.dart │ │ │ ├── send_file_dialog.dart │ │ │ ├── send_file_dialog_style.dart │ │ │ └── send_file_dialog_view.dart │ │ ├── sticker_picker_dialog.dart │ │ ├── sticky_timestamp_widget.dart │ │ ├── tombstone_display.dart │ │ ├── typing_indicators.dart │ │ └── widgets_bottom_sheet.dart │ ├── chat_adaptive_scaffold │ │ ├── chat_adaptive_scaffold.dart │ │ ├── chat_adaptive_scaffold_builder.dart │ │ └── chat_adaptive_scaffold_style.dart │ ├── chat_blank │ │ ├── chat_blank.dart │ │ ├── chat_blank_style.dart │ │ └── chat_qr_code.dart │ ├── chat_details │ │ ├── chat_details.dart │ │ ├── chat_details_actions_button.dart │ │ ├── chat_details_actions_enum.dart │ │ ├── chat_details_edit.dart │ │ ├── chat_details_edit_context_menu_actions.dart │ │ ├── chat_details_edit_option.dart │ │ ├── chat_details_edit_option_style.dart │ │ ├── chat_details_edit_view.dart │ │ ├── chat_details_edit_view_style.dart │ │ ├── chat_details_header_view.dart │ │ ├── chat_details_navigator.dart │ │ ├── chat_details_page_view │ │ │ ├── chat_details_members_page.dart │ │ │ ├── chat_details_page_enum.dart │ │ │ ├── chat_details_page_view.dart │ │ │ ├── chat_details_page_view_style.dart │ │ │ ├── files │ │ │ │ ├── chat_details_files_item │ │ │ │ │ ├── chat_details_files_item.dart │ │ │ │ │ ├── chat_details_files_item_style.dart │ │ │ │ │ └── chat_details_files_item_view.dart │ │ │ │ ├── chat_details_files_item_web │ │ │ │ │ ├── chat_details_files_item_view_web.dart │ │ │ │ │ └── chat_details_files_item_web.dart │ │ │ │ ├── chat_details_files_page.dart │ │ │ │ ├── chat_details_files_page_style.dart │ │ │ │ ├── chat_details_files_row │ │ │ │ │ ├── chat_details_file_download_tile.dart │ │ │ │ │ ├── chat_details_file_downloaded_tile.dart │ │ │ │ │ ├── chat_details_file_downloading_tile.dart │ │ │ │ │ ├── chat_details_file_row_body.dart │ │ │ │ │ ├── chat_details_file_row_downloading_web.dart │ │ │ │ │ ├── chat_details_file_row_web.dart │ │ │ │ │ ├── chat_details_row_downloading_wrapper.dart │ │ │ │ │ └── chat_details_row_wrapper.dart │ │ │ │ └── chat_details_files_tile │ │ │ │ │ ├── chat_details_file_downloading_tile.dart │ │ │ │ │ └── chat_details_file_row_web.dart │ │ │ ├── links │ │ │ │ ├── chat_details_links_item.dart │ │ │ │ ├── chat_details_links_page.dart │ │ │ │ └── chat_details_links_style.dart │ │ │ └── media │ │ │ │ ├── chat_details_media_page.dart │ │ │ │ └── chat_details_media_style.dart │ │ ├── chat_details_view.dart │ │ ├── chat_details_view_style.dart │ │ └── participant_list_item │ │ │ ├── participant_list_item.dart │ │ │ └── participant_list_item_style.dart │ ├── chat_draft │ │ ├── draft_chat.dart │ │ ├── draft_chat_adaptive_scaffold.dart │ │ ├── draft_chat_empty_widget.dart │ │ ├── draft_chat_empty_widget_style.dart │ │ ├── draft_chat_input_row.dart │ │ ├── draft_chat_input_row_style.dart │ │ ├── draft_chat_view.dart │ │ └── draft_chat_view_style.dart │ ├── chat_encryption_settings │ │ ├── chat_encryption_settings.dart │ │ └── chat_encryption_settings_view.dart │ ├── chat_list │ │ ├── chat_custom_slidable_action.dart │ │ ├── chat_list.dart │ │ ├── chat_list_body_view.dart │ │ ├── chat_list_body_view_style.dart │ │ ├── chat_list_bottom_navigator.dart │ │ ├── chat_list_bottom_navigator_style.dart │ │ ├── chat_list_header.dart │ │ ├── chat_list_header_style.dart │ │ ├── chat_list_item.dart │ │ ├── chat_list_item_style.dart │ │ ├── chat_list_item_subtitle.dart │ │ ├── chat_list_item_title.dart │ │ ├── chat_list_item_title_style.dart │ │ ├── chat_list_skeletonizer_style.dart │ │ ├── chat_list_skeletonizer_widget.dart │ │ ├── chat_list_view.dart │ │ ├── chat_list_view_builder.dart │ │ ├── chat_list_view_style.dart │ │ ├── client_chooser_button_style.dart │ │ ├── common_chat_list_item.dart │ │ ├── navi_rail_item.dart │ │ ├── receive_sharing_intent_mixin.dart │ │ ├── search_title.dart │ │ ├── slidable_chat_list_item.dart │ │ ├── space_view.dart │ │ └── stories_header.dart │ ├── chat_permissions_settings │ │ ├── chat_permissions_settings.dart │ │ ├── chat_permissions_settings_view.dart │ │ └── permission_list_tile.dart │ ├── chat_profile_info │ │ ├── chat_profile_info.dart │ │ ├── chat_profile_info_navigator.dart │ │ ├── chat_profile_info_style.dart │ │ └── chat_profile_info_view.dart │ ├── chat_search │ │ ├── chat_search.dart │ │ ├── chat_search_style.dart │ │ └── chat_search_view.dart │ ├── connect │ │ ├── connect_page.dart │ │ ├── connect_page_view.dart │ │ ├── connect_page_view_style.dart │ │ ├── sso_button.dart │ │ └── sso_login_state.dart │ ├── contacts_tab │ │ ├── contacts_appbar.dart │ │ ├── contacts_appbar_style.dart │ │ ├── contacts_invitation.dart │ │ ├── contacts_invitation_style.dart │ │ ├── contacts_invitation_view.dart │ │ ├── contacts_tab.dart │ │ ├── contacts_tab_body_view.dart │ │ ├── contacts_tab_view.dart │ │ ├── contacts_tab_view_style.dart │ │ └── empty_contacts_body.dart │ ├── device_settings │ │ ├── device_settings.dart │ │ ├── device_settings_view.dart │ │ └── user_device_list_item.dart │ ├── dialer │ │ ├── dialer.dart │ │ └── pip │ │ │ ├── dismiss_keyboard.dart │ │ │ └── pip_view.dart │ ├── error_page │ │ ├── error_page.dart │ │ └── error_page_style.dart │ ├── forward │ │ ├── forward.dart │ │ ├── forward_item_style.dart │ │ ├── forward_view.dart │ │ ├── forward_view_style.dart │ │ ├── forward_web_view.dart │ │ ├── forward_web_view_style.dart │ │ ├── recent_chat_list.dart │ │ ├── recent_chat_list_style.dart │ │ ├── recent_chat_title.dart │ │ └── search_forward_controller.dart │ ├── homeserver_picker │ │ ├── homeserver_app_bar.dart │ │ ├── homeserver_bottom_sheet.dart │ │ ├── homeserver_picker.dart │ │ ├── homeserver_picker_view.dart │ │ └── homeserver_state.dart │ ├── image_viewer │ │ ├── context_menu_item_image_viewer.dart │ │ ├── context_menu_item_image_viewer_style.dart │ │ ├── image_viewer.dart │ │ ├── image_viewer_style.dart │ │ ├── image_viewer_view.dart │ │ ├── media_viewer_app_bar.dart │ │ ├── media_viewer_app_bar_style.dart │ │ ├── media_viewer_app_bar_view.dart │ │ └── media_viewer_app_bar_web.dart │ ├── invitation_selection │ │ ├── invitation_selection.dart │ │ ├── invitation_selection_style.dart │ │ └── invitation_selection_web.dart │ ├── key_verification │ │ ├── key_verification_dialog.dart │ │ └── key_verification_styles.dart │ ├── login │ │ ├── login.dart │ │ ├── login_view.dart │ │ └── on_auth_redirect.dart │ ├── multiple_accounts │ │ └── multiple_accounts_picker.dart │ ├── new_group │ │ ├── contacts_selection.dart │ │ ├── contacts_selection_view.dart │ │ ├── contacts_selection_view_style.dart │ │ ├── new_group.dart │ │ ├── new_group_chat_info.dart │ │ ├── new_group_chat_info_style.dart │ │ ├── new_group_chat_info_view.dart │ │ ├── new_group_info_controller.dart │ │ ├── selected_contacts_map_change_notifier.dart │ │ └── widget │ │ │ ├── contact_item.dart │ │ │ ├── contacts_selection_list.dart │ │ │ ├── contacts_selection_list_style.dart │ │ │ ├── expansion_participants_list.dart │ │ │ ├── selected_participants_list.dart │ │ │ └── selected_participants_list_style.dart │ ├── new_private_chat │ │ ├── new_private_chat.dart │ │ ├── new_private_chat_style.dart │ │ ├── new_private_chat_view.dart │ │ ├── qr_scanner_modal.dart │ │ └── widget │ │ │ ├── contact_status_widget.dart │ │ │ ├── expansion_contact_list_tile.dart │ │ │ ├── expansion_list.dart │ │ │ ├── loading_contact_widget.dart │ │ │ └── no_contacts_found.dart │ ├── profile_info │ │ ├── copiable_profile_row │ │ │ ├── copiable_profile_row.dart │ │ │ ├── copiable_profile_row_style.dart │ │ │ ├── icon_copiable_profile_row.dart │ │ │ └── svg_copiable_profile_row.dart │ │ ├── profile_info_body │ │ │ ├── profile_info_body.dart │ │ │ ├── profile_info_body_view.dart │ │ │ ├── profile_info_body_view_style.dart │ │ │ ├── profile_info_contact_rows.dart │ │ │ └── profile_info_header.dart │ │ ├── profile_info_page.dart │ │ ├── profile_info_view.dart │ │ └── profile_info_view_style.dart │ ├── search │ │ ├── recent_contacts_banner_widget.dart │ │ ├── recent_contacts_banner_widget_style.dart │ │ ├── recent_item_widget.dart │ │ ├── recent_item_widget_style.dart │ │ ├── search.dart │ │ ├── search_contacts_and_chats_controller.dart │ │ ├── search_debouncer_mixin.dart │ │ ├── search_external_contact.dart │ │ ├── search_external_contact_style.dart │ │ ├── search_mixin.dart │ │ ├── search_text_field.dart │ │ ├── search_view.dart │ │ ├── search_view_style.dart │ │ ├── server_search_controller.dart │ │ ├── server_search_view.dart │ │ └── server_search_view_style.dart │ ├── settings_dashboard │ │ ├── settings │ │ │ ├── settings.dart │ │ │ ├── settings_item_builder.dart │ │ │ ├── settings_view.dart │ │ │ └── settings_view_style.dart │ │ ├── settings_3pid │ │ │ ├── settings_3pid.dart │ │ │ └── settings_3pid_view.dart │ │ ├── settings_app_language │ │ │ ├── settings_app_language.dart │ │ │ ├── settings_app_language_view.dart │ │ │ └── settings_app_language_view_style.dart │ │ ├── settings_chat │ │ │ ├── settings_chat.dart │ │ │ └── settings_chat_view.dart │ │ ├── settings_emotes │ │ │ ├── settings_emotes.dart │ │ │ └── settings_emotes_view.dart │ │ ├── settings_ignore_list │ │ │ ├── settings_ignore_list.dart │ │ │ └── settings_ignore_list_view.dart │ │ ├── settings_multiple_emotes │ │ │ ├── settings_multiple_emotes.dart │ │ │ └── settings_multiple_emotes_view.dart │ │ ├── settings_notifications │ │ │ ├── settings_notifications.dart │ │ │ └── settings_notifications_view.dart │ │ ├── settings_profile │ │ │ ├── settings_profile.dart │ │ │ ├── settings_profile_context_menu_actions.dart │ │ │ ├── settings_profile_item.dart │ │ │ ├── settings_profile_item_style.dart │ │ │ ├── settings_profile_state │ │ │ │ ├── get_clients_ui_state.dart │ │ │ │ └── settings_profile_ui_state.dart │ │ │ ├── settings_profile_view.dart │ │ │ ├── settings_profile_view_mobile.dart │ │ │ ├── settings_profile_view_mobile_style.dart │ │ │ ├── settings_profile_view_style.dart │ │ │ ├── settings_profile_view_web.dart │ │ │ └── settings_profile_view_web_style.dart │ │ ├── settings_security │ │ │ ├── settings_security.dart │ │ │ └── settings_security_view.dart │ │ ├── settings_stories │ │ │ ├── settings_stories.dart │ │ │ └── settings_stories_view.dart │ │ └── settings_style │ │ │ ├── settings_style.dart │ │ │ └── settings_style_view.dart │ ├── share │ │ ├── share.dart │ │ └── share_view.dart │ ├── sign_up │ │ ├── signup.dart │ │ └── signup_view.dart │ ├── story │ │ ├── story_page.dart │ │ └── story_view.dart │ └── twake_welcome │ │ ├── twake_welcome.dart │ │ ├── twake_welcome_view.dart │ │ └── twake_welcome_view_style.dart ├── presentation │ ├── decorators │ │ └── chat_list │ │ │ ├── subtitle_image_preview_style.dart │ │ │ ├── subtitle_text_style_decorator │ │ │ ├── subtitle_text_style_component.dart │ │ │ ├── subtitle_text_style_decorator.dart │ │ │ └── subtitle_text_style_view.dart │ │ │ └── title_text_style_decorator │ │ │ ├── title_text_style_component.dart │ │ │ ├── title_text_style_decorator.dart │ │ │ └── title_text_style_view.dart │ ├── enum │ │ ├── chat │ │ │ ├── chat_details_screen_enum.dart │ │ │ ├── media_viewer_popup_result_enum.dart │ │ │ ├── popup_menu_item_web_enum.dart │ │ │ ├── right_column_type_enum.dart │ │ │ └── send_media_with_caption_status_enum.dart │ │ ├── chat_list │ │ │ └── chat_list_enum.dart │ │ ├── contacts │ │ │ └── warning_contacts_banner_enum.dart │ │ ├── profile_info │ │ │ └── profile_info_body_enum.dart │ │ └── settings │ │ │ ├── settings_action_enum.dart │ │ │ ├── settings_enum.dart │ │ │ └── settings_profile_enum.dart │ ├── extensions │ │ ├── client_extension.dart │ │ ├── contact │ │ │ └── presentation_contact_extension.dart │ │ ├── event_update_extension.dart │ │ ├── go_router_extensions.dart │ │ ├── image_extension.dart │ │ ├── localizations │ │ │ └── locale_extension.dart │ │ ├── media │ │ │ └── url_preview_extension.dart │ │ ├── multiple_accounts │ │ │ └── client_profile_extension.dart │ │ ├── room_summary_extension.dart │ │ ├── search │ │ │ ├── presentation_search_extensions.dart │ │ │ └── search_model_extension.dart │ │ ├── send_file_extension.dart │ │ ├── send_file_web_extension.dart │ │ ├── shared_media_file_extension.dart │ │ ├── text_editting_controller_extension.dart │ │ └── value_notifier_custom.dart │ ├── fake_sending_file_info.dart │ ├── list_notifier.dart │ ├── mixins │ │ ├── address_book_mixin.dart │ │ ├── chat_details_tab_mixin.dart │ │ ├── chat_list_item_mixin.dart │ │ ├── common_media_picker_mixin.dart │ │ ├── comparable_presentation_contact_mixin.dart │ │ ├── comparable_presentation_search_mixin.dart │ │ ├── connect_page_mixin.dart │ │ ├── contacts_view_controller_mixin.dart │ │ ├── delete_event_mixin.dart │ │ ├── go_to_direct_chat_mixin.dart │ │ ├── go_to_group_chat_mixin.dart │ │ ├── handle_clipboard_action_mixin.dart │ │ ├── handle_video_download_mixin.dart │ │ ├── init_config_mixin.dart │ │ ├── invitation_status_mixin.dart │ │ ├── invite_external_contact_mixin.dart │ │ ├── leave_chat_mixin.dart │ │ ├── linkify_mixin.dart │ │ ├── media_picker_mixin.dart │ │ ├── media_viewer_app_bar_mixin.dart │ │ ├── message_avatar_mixin.dart │ │ ├── paste_image_mixin.dart │ │ ├── pick_avatar_mixin.dart │ │ ├── play_video_action_mixin.dart │ │ ├── save_file_to_twake_downloads_folder_mixin.dart │ │ ├── save_media_to_gallery_android_mixin.dart │ │ ├── search_recent_chat_mixin.dart │ │ ├── send_files_mixin.dart │ │ ├── send_files_with_caption_web_mixin.dart │ │ ├── single_image_picker_mixin.dart │ │ └── wellknown_mixin.dart │ ├── model │ │ ├── chat │ │ │ ├── chat_router_input_argument.dart │ │ │ ├── downloading_state_presentation_model.dart │ │ │ ├── events │ │ │ │ └── message │ │ │ │ │ └── message_metrics.dart │ │ │ ├── image_viewer_argument.dart │ │ │ ├── pop_up_menu_item_model.dart │ │ │ ├── upload_file_ui_state.dart │ │ │ └── view_event_list_ui_state.dart │ │ ├── chat_details │ │ │ └── chat_details_page_model.dart │ │ ├── chat_list │ │ │ └── chat_selection_actions.dart │ │ ├── client_login_state_event.dart │ │ ├── clipboard │ │ │ └── clipboard_image_info.dart │ │ ├── contact │ │ │ ├── get_presentation_contacts_empty.dart │ │ │ ├── get_presentation_contacts_failure.dart │ │ │ ├── get_presentation_contacts_success.dart │ │ │ ├── presentation_contact.dart │ │ │ ├── presentation_contact_constant.dart │ │ │ └── presentation_contact_success.dart │ │ ├── file │ │ │ ├── default_asset_entity.dart │ │ │ ├── display_image_info.dart │ │ │ ├── file_asset_entity.dart │ │ │ ├── image_asset_entity.dart │ │ │ └── video_asset_entity.dart │ │ ├── forward │ │ │ └── forward_argument.dart │ │ ├── image_type.dart │ │ ├── media │ │ │ └── url_preview_presentation.dart │ │ ├── pick_avatar_state.dart │ │ ├── pop_result.dart │ │ ├── pop_result_from_forward.dart │ │ ├── search │ │ │ ├── presentation_search.dart │ │ │ ├── presentation_search_state.dart │ │ │ ├── presentation_search_state_extension.dart │ │ │ ├── presentation_server_side_empty_search.dart │ │ │ ├── presentation_server_side_search.dart │ │ │ └── presentation_server_side_state.dart │ │ └── settings │ │ │ └── settings_profile_presentation.dart │ ├── multiple_account │ │ ├── client_profile_presentation.dart │ │ └── twake_chat_presentation_account.dart │ ├── same_type_events_builder │ │ ├── same_type_events_builder.dart │ │ └── same_type_events_controller.dart │ ├── state │ │ ├── failure.dart │ │ └── success.dart │ └── style │ │ └── media_picker_style.dart ├── resource │ ├── assets_paths.dart │ ├── colors.dart │ └── image_paths.dart ├── utils │ ├── account_bundles.dart │ ├── adaptive_bottom_sheet.dart │ ├── background_push.dart │ ├── beautify_string_extension.dart │ ├── client_manager.dart │ ├── clipboard.dart │ ├── common_helper.dart │ ├── custom_dismissable.dart │ ├── custom_http_client.dart │ ├── custom_image_resizer.dart │ ├── custom_scroll_behaviour.dart │ ├── custom_svg_icons.dart │ ├── date_time_extension.dart │ ├── dialog │ │ ├── downloading_file_dialog.dart │ │ ├── downloading_file_dialog_style.dart │ │ ├── twake_dialog.dart │ │ └── warning_dialog.dart │ ├── display_name_widget.dart │ ├── exception │ │ ├── download_file_web_exception.dart │ │ ├── downloading_exception.dart │ │ ├── homeserver_exception.dart │ │ ├── leave_room_exception.dart │ │ ├── save_to_downloads_exception.dart │ │ ├── save_to_gallery_exception.dart │ │ ├── storage_permission_exception.dart │ │ └── upload_exception.dart │ ├── extension │ │ ├── basic_event_extension.dart │ │ ├── build_context_extension.dart │ │ ├── event_info_extension.dart │ │ ├── event_status_custom_extension.dart │ │ ├── global_key_extension.dart │ │ ├── image_size_extension.dart │ │ ├── mime_type_extension.dart │ │ ├── navigator_state_extension.dart │ │ ├── presentation_search_extension.dart │ │ ├── string_extension.dart │ │ ├── value_notifier_extension.dart │ │ └── web_url_creation_extension.dart │ ├── famedlysdk_store.dart │ ├── interactive_viewer_gallery.dart │ ├── js_window │ │ ├── js_window.dart │ │ ├── non_js_window.dart │ │ └── universal_image_bitmap.dart │ ├── localized_camera_picker_text_delegate.dart │ ├── localized_exception_extension.dart │ ├── manager │ │ ├── download_manager │ │ │ ├── download_file_info.dart │ │ │ ├── download_file_state.dart │ │ │ ├── download_manager.dart │ │ │ └── downloading_worker_queue.dart │ │ ├── storage_directory_manager.dart │ │ └── upload_manager │ │ │ ├── models │ │ │ ├── upload_caption_info.dart │ │ │ ├── upload_file_info.dart │ │ │ └── upload_info.dart │ │ │ ├── upload_manager.dart │ │ │ ├── upload_state.dart │ │ │ └── upload_worker_queue.dart │ ├── matrix_sdk_extensions │ │ ├── client_stories_extension.dart │ │ ├── device_extension.dart │ │ ├── download_file_extension.dart │ │ ├── download_file_web_extension.dart │ │ ├── event_extension.dart │ │ ├── filtered_timeline_extension.dart │ │ ├── flutter_hive_collections_database.dart │ │ ├── int_extension.dart │ │ ├── ios_badge_client_extension.dart │ │ ├── matrix_file_extension.dart │ │ ├── matrix_locals.dart │ │ ├── presence_extension.dart │ │ └── result_extension.dart │ ├── mime_type_uitls.dart │ ├── network_connection_service.dart │ ├── one_time_debouncer.dart │ ├── permission_dialog.dart │ ├── permission_service.dart │ ├── platform_infos.dart │ ├── power_level_manager.dart │ ├── push_helper.dart │ ├── resize_image.dart │ ├── responsive │ │ └── responsive_utils.dart │ ├── room_status_extension.dart │ ├── scroll_controller_extension.dart │ ├── size_string.dart │ ├── story_theme_data.dart │ ├── stream_extension.dart │ ├── stream_list_int_extension.dart │ ├── string_color.dart │ ├── string_extension.dart │ ├── task_queue │ │ ├── task.dart │ │ ├── task_state.dart │ │ └── worker_queue.dart │ ├── tor_stub.dart │ ├── twake_snackbar.dart │ ├── uia_request_manager.dart │ ├── update_checker_no_store.dart │ ├── url_launcher.dart │ ├── voip │ │ ├── callkeep_manager.dart │ │ └── user_media_manager.dart │ ├── voip_plugin.dart │ └── warning_dialog.dart └── widgets │ ├── adaptive_flat_button.dart │ ├── app_bars │ ├── searchable_app_bar.dart │ ├── searchable_app_bar_style.dart │ ├── twake_app_bar.dart │ └── twake_app_bar_style.dart │ ├── avatar │ ├── avatar.dart │ ├── avatar_style.dart │ ├── avatar_with_bottom_icon_widget.dart │ ├── bottom_navigation_avatar.dart │ └── bottom_navigation_avatar_style.dart │ ├── chat_settings_popup_menu.dart │ ├── clean_rich_text.dart │ ├── connection_status_header.dart │ ├── contacts_warning_banner │ ├── contacts_warning_banner_style.dart │ └── contacts_warning_banner_view.dart │ ├── context_menu │ ├── context_menu_action.dart │ ├── context_menu_action_item.dart │ ├── context_menu_action_item_widget.dart │ ├── context_menu_position.dart │ ├── twake_context_menu.dart │ └── twake_context_menu_area.dart │ ├── context_menu_builder_ios_paste_without_permission.dart │ ├── file_widget │ ├── base_file_tile_widget.dart │ ├── circular_loading_download_widget.dart │ ├── download_file_tile_widget.dart │ ├── downloading_file_tile_widget.dart │ ├── file_error_tile_widget_style.dart │ ├── file_tile_widget.dart │ ├── file_tile_widget_style.dart │ └── message_file_tile_style.dart │ ├── hero_page_route.dart │ ├── highlight_text.dart │ ├── layouts │ ├── adaptive_layout │ │ ├── adaptive_scaffold_appbar.dart │ │ ├── adaptive_scaffold_appbar_style.dart │ │ ├── adaptive_scaffold_primary_navigation.dart │ │ ├── adaptive_scaffold_primary_navigation_style.dart │ │ ├── adaptive_scaffold_primary_navigation_view.dart │ │ ├── adaptive_scaffold_route_style.dart │ │ ├── adaptive_scaffold_view_style.dart │ │ ├── app_adaptive_scaffold.dart │ │ ├── app_adaptive_scaffold_body.dart │ │ ├── app_adaptive_scaffold_body_view.dart │ │ └── app_adaptive_scaffold_body_view_style.dart │ ├── agruments │ │ ├── app_adaptive_scaffold_body_args.dart │ │ ├── logged_in_body_args.dart │ │ ├── logged_in_other_account_body_args.dart │ │ ├── logout_body_args.dart │ │ ├── receive_content_args.dart │ │ └── switch_active_account_body_args.dart │ ├── enum │ │ └── adaptive_destinations_enum.dart │ ├── login_scaffold.dart │ └── max_width_body.dart │ ├── link_browser_widget.dart │ ├── local_notifications_extension.dart │ ├── lock_screen.dart │ ├── log_view.dart │ ├── matrix.dart │ ├── mentioned_user.dart │ ├── mixins │ ├── download_file_on_mobile_mixin.dart │ ├── download_file_on_web_mixin.dart │ ├── drag_drog_file_mixin.dart │ ├── get_preview_url_mixin.dart │ ├── handle_download_and_preview_file_mixin.dart │ ├── on_account_data_listen_mixin.dart │ ├── popup_context_menu_action_mixin.dart │ ├── popup_menu_widget_mixin.dart │ ├── popup_menu_widget_style.dart │ ├── show_dialog_mixin.dart │ ├── twake_context_menu_mixin.dart │ ├── twake_context_menu_style.dart │ └── upload_file_mixin.dart │ ├── mxc_image.dart │ ├── permission_slider_dialog.dart │ ├── phone_book_loading │ ├── phone_book_loading_style.dart │ └── phone_book_loading_view.dart │ ├── profile_bottom_sheet.dart │ ├── public_room_bottom_sheet.dart │ ├── search │ ├── empty_search_widget.dart │ └── empty_search_widget_style.dart │ ├── set_active_client_state.dart │ ├── setting_tile.dart │ ├── settings_switch_list_tile.dart │ ├── sliver_expandable_list.dart │ ├── slogan_builder.dart │ ├── stream_image_view.dart │ ├── swipe_to_dismiss_wrap.dart │ ├── swipeable.dart │ ├── switch_button.dart │ ├── theme_builder.dart │ ├── twake_app.dart │ ├── twake_components │ ├── twake_avatar.dart │ ├── twake_chip.dart │ ├── twake_fab.dart │ ├── twake_header.dart │ ├── twake_header_style.dart │ ├── twake_icon_button.dart │ ├── twake_loading │ │ ├── animated_loading_widget.dart │ │ ├── center_loading_indicator.dart │ │ ├── flashing_circle_widget.dart │ │ ├── status_loading_widget.dart │ │ └── twake_loading_indicator.dart │ ├── twake_navigation_icon │ │ ├── twake_navigation_icon.dart │ │ └── twake_navigation_icon_style.dart │ ├── twake_preview_link │ │ ├── twake_link_preview.dart │ │ ├── twake_link_preview_item.dart │ │ ├── twake_link_preview_item_style.dart │ │ ├── twake_link_view.dart │ │ └── twake_link_view_style.dart │ ├── twake_preview_placeholder.dart │ ├── twake_smart_refresher.dart │ ├── twake_text_button.dart │ └── twake_text_button_style.dart │ ├── unread_rooms_badge.dart │ ├── video_player.dart │ ├── video_viewer_desktop_theme.dart │ ├── video_viewer_mobile_theme.dart │ └── video_viewer_style.dart ├── linux ├── .gitignore ├── CMakeLists.txt ├── flutter │ ├── CMakeLists.txt │ ├── generated_plugin_registrant.cc │ ├── generated_plugin_registrant.h │ └── generated_plugins.cmake ├── main.cc ├── my_application.cc ├── my_application.h └── packaging │ └── appimage │ └── make_config.yaml ├── macos ├── .gitignore ├── Flutter │ ├── Flutter-Debug.xcconfig │ ├── Flutter-Release.xcconfig │ └── GeneratedPluginRegistrant.swift ├── Gemfile ├── Gemfile.lock ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ └── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── app_icon_1024.png │ │ │ ├── app_icon_128.png │ │ │ ├── app_icon_16.png │ │ │ ├── app_icon_256.png │ │ │ ├── app_icon_32.png │ │ │ ├── app_icon_512.png │ │ │ └── app_icon_64.png │ ├── Base.lproj │ │ └── MainMenu.xib │ ├── Configs │ │ ├── AppInfo.xcconfig │ │ ├── Debug.xcconfig │ │ ├── Release.xcconfig │ │ └── Warnings.xcconfig │ ├── DebugProfile.entitlements │ ├── Info.plist │ ├── MainFlutterWindow.swift │ └── Release.entitlements ├── fastlane │ ├── Appfile │ ├── Fastfile │ ├── Matchfile │ └── README.md └── packaging │ └── dmg │ └── make_config.yaml ├── pubspec.lock ├── pubspec.yaml ├── scripts ├── build-android-apk.sh ├── build-android-debug.sh ├── build-ios.sh ├── build-linux-debug.sh ├── build-linux.sh ├── build-macos-debug.sh ├── build-macos.sh ├── build-olm-windows.sh ├── build-web.sh ├── build-windows-debug.sh ├── build-windows.sh ├── code_analyze.sh ├── config-pre-commit.sh ├── copy-nse │ ├── .gitignore │ ├── README.MD │ ├── index.js │ ├── package-lock.json │ └── package.json ├── create_fdroid_repos.sh ├── enable-android-google-services.patch ├── generate_command_hints_glue.sh ├── integration-check-release-build.sh ├── integration-create-environment-variables.sh ├── integration-prepare-homeserver.sh ├── integration-prepare-host.sh ├── integration-server-conduit.sh ├── integration-server-dendrite.sh ├── integration-server-synapse.sh ├── integration-start-avd.sh ├── open-mr.sh ├── package-linux-debug.sh ├── package-linux.sh ├── package-macos-debug.sh ├── package-macos.sh ├── package-windows-debug.sh ├── package-windows.ps1 ├── package-windows.sh ├── patchs │ ├── element-x-nse-fix.patch │ └── ios-extension-debug.patch ├── pre-commit ├── prepare-android-release.sh ├── prepare-fdroid.sh ├── prepare-ios.sh ├── prepare-web-debug.sh ├── prepare-web.sh ├── prepare-windows.ps1 ├── release-android-apk.sh ├── release-ios-testflight.sh ├── release-playstore-beta.sh ├── release-playstore.sh └── update-dependencies.sh ├── server └── nginx.conf ├── test ├── archive_test.dart ├── command_hint_test.dart ├── data │ └── datasource_impl │ │ └── contact │ │ └── phonebook_contact_datasource_impl_test.dart ├── domain │ ├── contacts │ │ └── contacts_manager_test.dart │ ├── extensions │ │ ├── contact │ │ │ └── contact_extension_test.dart │ │ └── home_summary_extensions_test.dart │ ├── model │ │ ├── address_book_test.dart │ │ ├── contact_test.dart │ │ ├── discovery_information_test.dart │ │ └── verification │ │ │ └── composite_name_validator_test.dart │ └── usecase │ │ ├── contacts │ │ ├── federation_look_up_phonebook_contact_interactor_test.dart │ │ ├── post_address_book_interactor_test.dart │ │ └── twake_look_up_phonebook_contact_interactor_test.dart │ │ ├── invitation │ │ ├── generate_invitation_link_interactor_test.dart │ │ ├── get_invitation_status_interactor_test.dart │ │ ├── hive_delete_invitation_status_interactor_test.dart │ │ ├── hive_get_invitation_status_interactor_test.dart │ │ ├── send_invitation_interactor_test.dart │ │ └── store_invitation_status_interactor_test.dart │ │ └── verify_name_interactor_test.dart ├── files │ └── get_available_file_path_test.dart ├── fixtures │ └── contact_fixtures.dart ├── hive │ ├── contact │ │ └── hive_contact_test.dart │ └── fake_tom_collection_database.dart ├── homeserver_picker_test.dart ├── interceptor │ └── download_file_interceptor_test.dart ├── list_notifier_test.dart ├── mixin │ ├── chat │ │ └── chat_list_item_mixin_test.dart │ ├── contacts_view_controller_mixin_test.dart │ ├── message_avatar_mixin_test.dart │ ├── pick_avatar_mixin_test.dart │ └── search │ │ └── search_mixin_test.dart ├── modules │ ├── federation_contact_fixtures.dart │ └── federation_identity_lookup │ │ └── domain │ │ └── usecase │ │ └── federation_identity_lookup_interactor_test.dart ├── pages │ ├── chat │ │ └── events │ │ │ └── message │ │ │ └── message_content_builder_mixin_test.dart │ ├── chat_list │ │ └── chat_list_test.dart │ ├── new_private_chat │ │ └── widget │ │ │ └── contact_status_widget_test.dart │ └── search │ │ └── server_search_view_test.dart ├── presentation │ └── mixins │ │ ├── invitation_status_mixin_test.dart │ │ └── wellknown_mixin_test.dart ├── stream_list_in_extension_test.dart ├── string_extension_test.dart ├── utils │ ├── date_time_extension_test.dart │ ├── get_localize_status_test.dart │ ├── get_shortcut_name_avatar_test.dart │ ├── manager │ │ └── upload_manager_test.dart │ ├── matrix_sdk_extensions │ │ └── matrix_file_extension_test.dart │ ├── power_level_manager_test.dart │ ├── presentation_search_extension_test.dart │ ├── search_result_extension_test.dart │ ├── short_cut_input_bar_test.dart │ ├── stream_list_int_extension_test.dart │ ├── string_extension_test.dart │ └── test_client.dart ├── widget │ ├── app_bars │ │ └── searchable_app_bar_test.dart │ ├── message │ │ └── twake_link_preview_item_test.dart │ └── stream_image_view_test.dart ├── widget_test.dart └── worker_queue_test.dart ├── test_driver └── integration_test.dart ├── web ├── auth.html ├── favicon.png ├── icons │ ├── Icon-192.png │ └── Icon-512.png ├── index.html ├── manifest.json ├── script.js ├── splash │ ├── img │ │ ├── branding-1x.png │ │ ├── branding-2x.png │ │ ├── branding-3x.png │ │ ├── branding-4x.png │ │ ├── branding-dark-1x.png │ │ ├── branding-dark-2x.png │ │ ├── branding-dark-3x.png │ │ ├── branding-dark-4x.png │ │ ├── dark-1x.png │ │ ├── dark-2x.png │ │ ├── dark-3x.png │ │ ├── dark-4x.png │ │ ├── light-1x.png │ │ ├── light-2x.png │ │ ├── light-3x.png │ │ └── light-4x.png │ └── splash.js └── style.css ├── windows ├── .gitignore ├── CMakeLists.txt ├── flutter │ ├── CMakeLists.txt │ ├── generated_plugin_registrant.cc │ ├── generated_plugin_registrant.h │ └── generated_plugins.cmake ├── packaging │ └── exe │ │ ├── inno_setup.iss │ │ └── make_config.yaml └── runner │ ├── CMakeLists.txt │ ├── Runner.rc │ ├── flutter_window.cpp │ ├── flutter_window.h │ ├── main.cpp │ ├── resource.h │ ├── resources │ └── app_icon.ico │ ├── runner.exe.manifest │ ├── utils.cpp │ ├── utils.h │ ├── win32_window.cpp │ └── win32_window.h └── winuwp ├── .gitignore ├── CMakeLists.txt ├── flutter ├── CMakeLists.txt ├── flutter_windows.h ├── generated_plugin_registrant.cc ├── generated_plugin_registrant.h └── generated_plugins.cmake ├── project_version └── runner_uwp ├── Assets ├── LargeTile.scale-100.png ├── LargeTile.scale-125.png ├── LargeTile.scale-150.png ├── LargeTile.scale-200.png ├── LargeTile.scale-400.png ├── LockScreenLogo.scale-200.png ├── SmallTile.scale-100.png ├── SmallTile.scale-125.png ├── SmallTile.scale-150.png ├── SmallTile.scale-200.png ├── SmallTile.scale-400.png ├── SplashScreen.scale-100.png ├── SplashScreen.scale-125.png ├── SplashScreen.scale-150.png ├── SplashScreen.scale-200.png ├── SplashScreen.scale-400.png ├── Square150x150Logo.scale-100.png ├── Square150x150Logo.scale-125.png ├── Square150x150Logo.scale-150.png ├── Square150x150Logo.scale-200.png ├── Square150x150Logo.scale-400.png ├── Square44x44Logo.altform-unplated_targetsize-16.png ├── Square44x44Logo.altform-unplated_targetsize-256.png ├── Square44x44Logo.altform-unplated_targetsize-32.png ├── Square44x44Logo.altform-unplated_targetsize-48.png ├── Square44x44Logo.scale-100.png ├── Square44x44Logo.scale-125.png ├── Square44x44Logo.scale-150.png ├── Square44x44Logo.scale-200.png ├── Square44x44Logo.scale-400.png ├── Square44x44Logo.targetsize-16.png ├── Square44x44Logo.targetsize-24.png ├── Square44x44Logo.targetsize-24_altform-unplated.png ├── Square44x44Logo.targetsize-256.png ├── Square44x44Logo.targetsize-32.png ├── Square44x44Logo.targetsize-48.png ├── StoreLogo.png ├── StoreLogo.scale-100.png ├── StoreLogo.scale-125.png ├── StoreLogo.scale-150.png ├── StoreLogo.scale-200.png ├── StoreLogo.scale-400.png ├── Wide310x150Logo.scale-200.png ├── WideTile.scale-100.png ├── WideTile.scale-125.png ├── WideTile.scale-150.png ├── WideTile.scale-200.png └── WideTile.scale-400.png ├── CMakeLists.txt ├── CMakeSettings.json ├── Windows_TemporaryKey.pfx ├── appxmanifest.in ├── flutter_frameworkview.cpp ├── main.cpp └── resources.pri /.envrc: -------------------------------------------------------------------------------- 1 | use flake 2 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # This is a comment. 2 | # Each line is a file pattern followed by one or more owners. 3 | 4 | # These owners will be the default owners for everything in 5 | # the repo. Unless a later match takes precedence, 6 | # @global-owner1 and @global-owner2 will be requested for 7 | # review when someone opens a pull request. 8 | * @hoangdat @dab246 @nqhhdev @tddang-linagora 9 | -------------------------------------------------------------------------------- /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/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-hdpi/branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-mdpi/branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-v21/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-xhdpi/branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-xxhdpi/branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-xxxhdpi/branding.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/notifications_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/drawable/notifications_icon.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #ffffff 4 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/fastlane/Appfile: -------------------------------------------------------------------------------- 1 | json_key_file("keys.json") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one 2 | package_name("app.twake.android.chat") -------------------------------------------------------------------------------- /android/fastlane/metadata/android/en-US/changelogs/50 (0.22.1).txt: -------------------------------------------------------------------------------- 1 | Check out https://gitlab.com/ChristianPauly/fluffychat-flutter/-/blob/main/CHANGELOG.md for the changelog. -------------------------------------------------------------------------------- /android/fastlane/metadata/android/en-US/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/fastlane/metadata/android/en-US/images/featureGraphic.png -------------------------------------------------------------------------------- /android/fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /android/fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | A convenient Matrix-based tool for personal and corporate communication. -------------------------------------------------------------------------------- /android/fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | Twake Chat -------------------------------------------------------------------------------- /android/fastlane/metadata/android/en-US/video.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/android/fastlane/metadata/android/en-US/video.txt -------------------------------------------------------------------------------- /android/fastlane/report.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx4096m 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /appimage/.gitignore: -------------------------------------------------------------------------------- 1 | FluffyChat.AppDir 2 | *.AppImage 3 | *.AppImage.zsync 4 | -------------------------------------------------------------------------------- /appimage/AppRun: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | cd "$(dirname "$0")" 4 | exec ./fluffychat -------------------------------------------------------------------------------- /appimage/FluffyChat.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Type=Application 3 | Version=1.0 4 | Name=FluffyChat 5 | Comment=Matrix Client. Chat with your friends 6 | Exec=AppRun 7 | Icon=fluffychat 8 | Terminal=false 9 | Categories=Network;Chat;InstantMessaging;X-Matrix; -------------------------------------------------------------------------------- /assets/backup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/backup.png -------------------------------------------------------------------------------- /assets/blur.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/blur.png -------------------------------------------------------------------------------- /assets/branding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/branding.png -------------------------------------------------------------------------------- /assets/colors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/colors.png -------------------------------------------------------------------------------- /assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/favicon.png -------------------------------------------------------------------------------- /assets/google_fonts/Inter-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/google_fonts/Inter-Bold.ttf -------------------------------------------------------------------------------- /assets/google_fonts/Inter-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/google_fonts/Inter-Medium.ttf -------------------------------------------------------------------------------- /assets/google_fonts/Inter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/google_fonts/Inter-Regular.ttf -------------------------------------------------------------------------------- /assets/google_fonts/Inter-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/google_fonts/Inter-SemiBold.ttf -------------------------------------------------------------------------------- /assets/icons/icon_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/icons/icon_launcher.png -------------------------------------------------------------------------------- /assets/images/ic_done.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /assets/images/ic_encrypted.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/ic_reply.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/images/ic_send_status.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /assets/images/ic_status.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/info-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/info-logo.png -------------------------------------------------------------------------------- /assets/js/package/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/js/package/.gitkeep -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/logo.png -------------------------------------------------------------------------------- /assets/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/share.png -------------------------------------------------------------------------------- /assets/sounds/WoodenBeaver_stereo_message-new-instant.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/sounds/WoodenBeaver_stereo_message-new-instant.ogg -------------------------------------------------------------------------------- /assets/sounds/call.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/sounds/call.ogg -------------------------------------------------------------------------------- /assets/sounds/phone.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/sounds/phone.ogg -------------------------------------------------------------------------------- /assets/typing-indicator.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/typing-indicator.zip -------------------------------------------------------------------------------- /assets/verification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/assets/verification.png -------------------------------------------------------------------------------- /configurations/app_dashboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "apps": [ 3 | { 4 | "appName": "Twake Mail", 5 | "icon": "ic_twake_mail.svg", 6 | "appLink": "http://tmail.linagora.com/" 7 | }, 8 | { 9 | "appName": "Twake Drive", 10 | "icon": "ic_twake_drive.svg", 11 | "appLink": "https://tdrive.linagora.com/" 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /configurations/icons/ic_twake_support.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /configurations/nginx.conf.template: -------------------------------------------------------------------------------- 1 | server { 2 | listen ${TWAKECHAT_LISTEN_PORT}; 3 | 4 | location = / { 5 | return 301 ${TWAKECHAT_BASE_HREF}; 6 | } 7 | 8 | location / { 9 | root /usr/share/nginx/html; 10 | index index.html index.htm; 11 | try_files $uri $uri/ /index.html; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /docs/ZenKurenaido-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/ZenKurenaido-Regular.ttf -------------------------------------------------------------------------------- /docs/appstore-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/appstore-badge.png -------------------------------------------------------------------------------- /docs/browser-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/browser-badge.png -------------------------------------------------------------------------------- /docs/configurations/configure_push_gateway.md: -------------------------------------------------------------------------------- 1 | ## Configuration for push gateway 2 | 3 | 1. get the push gateway url and add the postfix 4 | ``` 5 | {pushGatewayUrl}/_matrix/push/v1/notify 6 | ``` 7 | Fx: `https://sygnal.domain.dev/_matrix/push/v1/notify` 8 | 9 | 2. build the app with `--dart-define` and the param `PUSH_NOTIFICATIONS_GATEWAY_URL` 10 | 11 | Fx: 12 | ``` 13 | flutter build apk --release --dart-define=PUSH_NOTIFICATIONS_GATEWAY_URL=https://sygnal.domain.dev/_matrix/push/v1/notify 14 | ``` 15 | -------------------------------------------------------------------------------- /docs/en/privacy.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Please follow this link.

8 | 9 | -------------------------------------------------------------------------------- /docs/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/favicon.png -------------------------------------------------------------------------------- /docs/fdroid_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/fdroid_button.png -------------------------------------------------------------------------------- /docs/firefox_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/firefox_icon.png -------------------------------------------------------------------------------- /docs/flathub-badge-en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/flathub-badge-en.png -------------------------------------------------------------------------------- /docs/google-play-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/google-play-badge.png -------------------------------------------------------------------------------- /docs/kofi_button_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/kofi_button_dark.png -------------------------------------------------------------------------------- /docs/screenshots/desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/screenshots/desktop.png -------------------------------------------------------------------------------- /docs/screenshots/mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/screenshots/mobile.png -------------------------------------------------------------------------------- /docs/screenshots/product.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/screenshots/product.jpeg -------------------------------------------------------------------------------- /docs/screenshots/screenshots.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/screenshots/screenshots.png -------------------------------------------------------------------------------- /docs/screenshots/showcase1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/screenshots/showcase1.jpeg -------------------------------------------------------------------------------- /docs/screenshots/showcase2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/screenshots/showcase2.jpeg -------------------------------------------------------------------------------- /docs/screenshots/showcase3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/screenshots/showcase3.jpeg -------------------------------------------------------------------------------- /docs/screenshots/showcase4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/screenshots/showcase4.jpeg -------------------------------------------------------------------------------- /docs/screenshots/showcase5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/docs/screenshots/showcase5.jpeg -------------------------------------------------------------------------------- /docs/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: [ 3 | './index.html' 4 | ], 5 | darkMode: false, 6 | theme: { 7 | extend: {}, 8 | }, 9 | variants: { 10 | extend: {}, 11 | }, 12 | plugins: [], 13 | } 14 | -------------------------------------------------------------------------------- /fastlane: -------------------------------------------------------------------------------- 1 | ./android/fastlane -------------------------------------------------------------------------------- /fdroid/.gitignore: -------------------------------------------------------------------------------- 1 | repo 2 | srclibs 3 | tmp 4 | chat.fluffy.fluffychat -------------------------------------------------------------------------------- /fdroid/config.nightly.py: -------------------------------------------------------------------------------- 1 | repo_url = "https://fluffychat.im/repo/nightly/repo" 2 | repo_name = "FluffyChat nightly repo" 3 | repo_icon = "fdroid-icon.png" 4 | repo_description = """ 5 | FluffyChat nightly repo 6 | """ 7 | 8 | archive_older = 0 9 | 10 | local_copy_dir = "/fdroid" 11 | 12 | keystore = "key.nightly.jks" 13 | repo_keyalias = "vmd66783.contaboserver.net" 14 | -------------------------------------------------------------------------------- /fdroid/config.stable.py: -------------------------------------------------------------------------------- 1 | repo_url = "https://fluffychat.im/repo/stable/repo" 2 | repo_name = "FluffyChat repo" 3 | repo_icon = "fdroid-icon.png" 4 | repo_description = """ 5 | FluffyChat repo 6 | """ 7 | 8 | archive_older = 0 9 | 10 | local_copy_dir = "/fdroid" 11 | 12 | keystore = "key.jks" 13 | repo_keyalias = "key" 14 | -------------------------------------------------------------------------------- /fdroid/fdroid-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/fdroid/fdroid-icon.png -------------------------------------------------------------------------------- /integration_test/.gitignore: -------------------------------------------------------------------------------- 1 | synapse/data/homeserver.db 2 | dendrite/data/server.* 3 | dendrite/data/matrix_key.pem 4 | dendrite/data/logs 5 | dendrite/data/jetstream 6 | dendrite/data/*.db -------------------------------------------------------------------------------- /integration_test/base/base_scenario.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:patrol/patrol.dart'; 3 | 4 | abstract class BaseScenario { 5 | final PatrolIntegrationTester $; 6 | 7 | const BaseScenario(this.$); 8 | 9 | Future execute(); 10 | 11 | Future expectViewVisible(PatrolFinder patrolFinder) async { 12 | await $.waitUntilVisible(patrolFinder); 13 | expect(patrolFinder, findsWidgets); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /integration_test/base/core_robot.dart: -------------------------------------------------------------------------------- 1 | import 'package:patrol/patrol.dart'; 2 | 3 | abstract class CoreRobot { 4 | final PatrolIntegrationTester $; 5 | 6 | CoreRobot(this.$); 7 | 8 | dynamic ignoreException() => $.tester.takeException(); 9 | } 10 | -------------------------------------------------------------------------------- /integration_test/synapse/data/localhost.signing.key: -------------------------------------------------------------------------------- 1 | ed25519 a_SLrz 0Ho/81rZZve88zdRxhaXWHUT6K3OqzmP35rNMZBUr6I 2 | -------------------------------------------------------------------------------- /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/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | -------------------------------------------------------------------------------- /ios/NSE/DesignKit/Tests/DesignKitTests.swift: -------------------------------------------------------------------------------- 1 | @testable import DesignKit 2 | import XCTest 3 | 4 | final class DesignKitTests: XCTestCase { 5 | func testExample() throws { 6 | XCTAssert(true) 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /ios/NSE/NSE.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.app.twake.ios.chat 8 | 9 | keychain-access-groups 10 | 11 | $(AppIdentifierPrefix)app.twake.ios.chat 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /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.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/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/BrandingImage.imageset/BrandingImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "background.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/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/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" -------------------------------------------------------------------------------- /ios/Runner/ar.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/ar.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/ar.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/ca.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/ca.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/ca.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/cs.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/cs.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/cs.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/de.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/de.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/eo.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/eo.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/eo.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/es.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/es.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/et.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/et.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/et.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/eu.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/eu.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/eu.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/fr.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/fr.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/gl.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/gl.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/gl.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/hr-HR.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/hr-HR.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/hr-HR.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/hu-HU.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/hu-HU.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/hu-HU.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/hu.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/hu.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/hu.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/hy.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/hy.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/hy.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/it.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/it.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/it.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/ja.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/ja.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/nb-NO.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/nb-NO.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/nb-NO.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/pl.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/pl.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/pl.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/pt.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/pt.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/pt.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/ru-RU.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/ru-RU.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/sk-SK.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/sk-SK.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/sk-SK.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/sv-SE.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/sv-SE.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/sv-SE.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/tr.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/tr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/tr.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/uk.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/uk.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "You have 1 encrypted message"; 2 | -------------------------------------------------------------------------------- /ios/Runner/uk.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/vi-VN.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/vi-VN.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "newMessageInTwake" = "Bạn có tin nhắn mới"; 2 | -------------------------------------------------------------------------------- /ios/Runner/vi-VN.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/zh-Hans.lproj/LaunchScreen.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Runner/zh-Hans.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/TwakeShareExtension/ShareViewController.swift: -------------------------------------------------------------------------------- 1 | import receive_sharing_intent 2 | 3 | class ShareViewController: RSIShareViewController { 4 | } 5 | -------------------------------------------------------------------------------- /ios/TwakeShareExtension/TwakeShareExtension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.app.twake.ios.chat 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/fastlane/Appfile: -------------------------------------------------------------------------------- 1 | app_identifier("app.twake.ios.chat") # The bundle identifier of your app 2 | 3 | # For more information about the Appfile, see: 4 | # https://docs.fastlane.tools/advanced/#appfile 5 | -------------------------------------------------------------------------------- /l10n.yaml: -------------------------------------------------------------------------------- 1 | arb-dir: assets/l10n 2 | template-arb-file: intl_en.arb 3 | output-localization-file: l10n.dart 4 | output-class: L10n 5 | preferred-supported-locales: ["en"] 6 | -------------------------------------------------------------------------------- /lib/app_state/failure.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | abstract class Failure extends Equatable { 4 | const Failure(); 5 | } 6 | -------------------------------------------------------------------------------- /lib/app_state/initial.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | abstract class Initial extends Success { 4 | const Initial() : super(); 5 | } 6 | -------------------------------------------------------------------------------- /lib/app_state/success_converter.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | abstract class SuccessConverter { 4 | Success convert(Success success); 5 | } 6 | -------------------------------------------------------------------------------- /lib/config/app_emojis.dart: -------------------------------------------------------------------------------- 1 | abstract class AppEmojis { 2 | static const List emojisDefault = [ 3 | '💜', 4 | '👍', 5 | '👎', 6 | '😂', 7 | '😭', 8 | ]; 9 | } 10 | -------------------------------------------------------------------------------- /lib/config/app_grid_config/app_config_parser.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/services.dart'; 4 | 5 | abstract class AppConfigParser { 6 | Future parse(String value); 7 | Future parseData(ByteData data); 8 | } 9 | -------------------------------------------------------------------------------- /lib/config/app_grid_config/app_grid_errors.dart: -------------------------------------------------------------------------------- 1 | class NotInitializedError implements Exception {} 2 | 3 | class ConfigurationNotFoundError implements Exception {} 4 | 5 | class EmptyConfiguration implements Exception {} 6 | 7 | class InvalidConfigurationParser implements Exception {} 8 | -------------------------------------------------------------------------------- /lib/config/config_saas/config_saas.dart: -------------------------------------------------------------------------------- 1 | class ConfigurationSaas { 2 | static const String registrationUrl = 'https://sign-up.twake.app/'; 3 | 4 | static const String twakeWorkplaceHomeserver = 'https://matrix.twake.app'; 5 | 6 | static const String homeserver = 'https://matrix.twake.app'; 7 | 8 | static const String platform = 'saas'; 9 | } 10 | -------------------------------------------------------------------------------- /lib/config/default_power_level_member.dart: -------------------------------------------------------------------------------- 1 | enum DefaultPowerLevelMember { 2 | user, 3 | moderator, 4 | admin; 5 | 6 | int get powerLevel { 7 | switch (this) { 8 | case DefaultPowerLevelMember.user: 9 | return 0; 10 | case DefaultPowerLevelMember.moderator: 11 | return 50; 12 | case DefaultPowerLevelMember.admin: 13 | return 100; 14 | default: 15 | return 0; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/config/go_routes/router_arguments.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | abstract class RouterArguments with EquatableMixin {} 4 | -------------------------------------------------------------------------------- /lib/config/localizations/language_code_constants.dart: -------------------------------------------------------------------------------- 1 | class LanguageCodeConstants { 2 | static const String english = 'en'; 3 | static const String french = 'fr'; 4 | static const String vietnamese = 'vi'; 5 | static const String russian = 'ru'; 6 | } 7 | -------------------------------------------------------------------------------- /lib/data/datasource/contact/address_book_datasource.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/data/model/addressbook/address_book_request.dart'; 2 | import 'package:fluffychat/data/model/addressbook/address_book_response.dart'; 3 | 4 | abstract class AddressBookDatasource { 5 | Future getAddressBook(); 6 | 7 | Future updateAddressBook({ 8 | required AddressBookRequest request, 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /lib/data/datasource/contact/hive_third_party_contact_datasource.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/contact/contact.dart'; 2 | 3 | abstract class HiveThirdPartyContactDatasource { 4 | Future> getThirdPartyContactByUserId(String userId); 5 | 6 | Future saveThirdPartyContactsForUser( 7 | String userId, 8 | List contacts, 9 | ); 10 | 11 | Future deleteThirdPartyContactBox(); 12 | } 13 | -------------------------------------------------------------------------------- /lib/data/datasource/contact/phonebook_datasource.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/contact/contact.dart'; 2 | 3 | abstract class PhonebookContactDatasource { 4 | Future> fetchContacts(); 5 | } 6 | -------------------------------------------------------------------------------- /lib/data/datasource/federation_configurations_datasource.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/data/model/federation_server/federation_configuration.dart'; 2 | 3 | abstract class FederationConfigurationsDatasource { 4 | Future getFederationConfigurations(String userId); 5 | 6 | Future saveFederationConfigurations( 7 | String userId, 8 | FederationConfigurations federationConfiguration, 9 | ); 10 | 11 | Future deleteFederationConfigurations(String userId); 12 | } 13 | -------------------------------------------------------------------------------- /lib/data/datasource/localizations/localizations_datasource.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | abstract class LocalizationsDataSource { 4 | Future persistLanguage(Locale localeCurrent); 5 | } 6 | -------------------------------------------------------------------------------- /lib/data/datasource/media/media_data_source.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/media/url_preview.dart'; 2 | 3 | abstract class MediaDataSource { 4 | Future getUrlPreview({ 5 | required Uri uri, 6 | int? preferredPreviewTime, 7 | }); 8 | } 9 | -------------------------------------------------------------------------------- /lib/data/datasource/multiple_account/multiple_account_datasource.dart: -------------------------------------------------------------------------------- 1 | abstract class MultipleAccountDatasource { 2 | Future storePersistActiveAccount(String userId); 3 | 4 | Future getPersistActiveAccount(); 5 | 6 | Future deletePersistActiveAccount(); 7 | } 8 | -------------------------------------------------------------------------------- /lib/data/datasource/reactions/reactions_datasource.dart: -------------------------------------------------------------------------------- 1 | abstract class ReactionsDatasource { 2 | Future storeRecentReactions(List recentReactions); 3 | 4 | Future> getRecentReactions(); 5 | 6 | Future removeRecentReactions(); 7 | } 8 | -------------------------------------------------------------------------------- /lib/data/datasource/recovery_words_data_source.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/recovery_words/recovery_words.dart'; 2 | 3 | abstract class RecoveryWordsDataSource { 4 | Future getRecoveryWords(); 5 | 6 | Future saveRecoveryWords(String recoveryWords); 7 | 8 | Future deleteRecoveryWords(); 9 | } 10 | -------------------------------------------------------------------------------- /lib/data/datasource/server_config_datasource.dart: -------------------------------------------------------------------------------- 1 | import 'package:matrix/matrix.dart'; 2 | 3 | abstract class ServerConfigDatasource { 4 | Future getServerConfig(); 5 | } 6 | -------------------------------------------------------------------------------- /lib/data/datasource/server_search_datasource.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/data/model/search/server_search_response.dart'; 2 | import 'package:matrix/matrix.dart'; 3 | 4 | abstract class ServerSearchDatasource { 5 | Future search({ 6 | required Categories searchCategories, 7 | String? nextBatch, 8 | }); 9 | } 10 | -------------------------------------------------------------------------------- /lib/data/datasource/tom_configurations_datasource.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/tom_configurations.dart'; 2 | 3 | abstract class ToMConfigurationsDatasource { 4 | Future getTomConfigurations(String userId); 5 | 6 | Future saveTomConfigurations( 7 | String userId, 8 | ToMConfigurations toMConfigurations, 9 | ); 10 | 11 | Future deleteTomConfigurations(String userId); 12 | } 13 | -------------------------------------------------------------------------------- /lib/data/datasource/tom_contacts_datasource.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/contact/contact.dart'; 2 | import 'package:fluffychat/domain/model/contact/contact_query.dart'; 3 | import 'package:fluffychat/domain/model/contact/lookup_mxid_request.dart'; 4 | 5 | abstract class TomContactsDatasource { 6 | Future> fetchContacts({ 7 | required ContactQuery query, 8 | int? limit, 9 | int? offset, 10 | LookupMxidRequest? lookupMxidRequest, 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /lib/data/hive/extension/invitation_status_hive_obj_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/data/hive/dto/invitation_status/invitation_status_hive_obj.dart'; 2 | import 'package:fluffychat/domain/model/invitation/invitation_status.dart'; 3 | 4 | extension InvitationStatusHiveObjExtension on InvitationStatusHiveObj { 5 | InvitationStatus toInvitationStatus() { 6 | return InvitationStatus( 7 | invitationId: invitationId, 8 | contactId: contactId, 9 | ); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/data/local/contact/enum/chunk_federation_contact_error_enum.dart: -------------------------------------------------------------------------------- 1 | enum ChunkLookUpContactErrorEnum { 2 | chunkError; 3 | 4 | String get message { 5 | switch (this) { 6 | case ChunkLookUpContactErrorEnum.chunkError: 7 | return 'Error fetching chunk federation contacts'; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/data/local/contact/enum/contacts_hive_error_enum.dart: -------------------------------------------------------------------------------- 1 | enum ContactsHiveErrorEnum { 2 | storeError; 3 | 4 | String get message { 5 | switch (this) { 6 | case ContactsHiveErrorEnum.storeError: 7 | return 'Error storing contacts'; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/data/local/contact/enum/contacts_vault_error_enum.dart: -------------------------------------------------------------------------------- 1 | enum ContactsVaultErrorEnum { 2 | uploadError, 3 | responseIsNull; 4 | 5 | String get message { 6 | switch (this) { 7 | case ContactsVaultErrorEnum.uploadError: 8 | return 'Error uploading contacts vault'; 9 | case ContactsVaultErrorEnum.responseIsNull: 10 | return 'Response is null'; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/data/network/exception/dio_duplicate_download_exception.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | import 'package:equatable/equatable.dart'; 3 | 4 | class DioDuplicateDownloadException extends DioException with EquatableMixin { 5 | DioDuplicateDownloadException({required super.requestOptions}) 6 | : super( 7 | message: 'Download already in progress', 8 | type: DioExceptionType.unknown, 9 | ); 10 | 11 | @override 12 | List get props => [message, requestOptions, type]; 13 | } 14 | -------------------------------------------------------------------------------- /lib/data/network/extensions/options_extensions.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | 3 | extension OptionsExtension on Options { 4 | Options appendHeaders(Map additionalHeaders) { 5 | if (headers != null) { 6 | headers?.addAll(additionalHeaders); 7 | } else { 8 | headers = additionalHeaders; 9 | } 10 | return this; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/data/network/media/cancel_exception.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class CancelRequestException with EquatableMixin { 4 | final String? reason; 5 | 6 | CancelRequestException({this.reason = ""}); 7 | 8 | @override 9 | List get props => [reason]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/data/network/service_path.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class ServicePath with EquatableMixin { 4 | final String path; 5 | 6 | ServicePath(this.path); 7 | 8 | @override 9 | List get props => [path]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/di/base_di.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/di/global/get_it_initializer.dart'; 2 | import 'package:get_it/get_it.dart'; 3 | import 'package:matrix/matrix.dart'; 4 | 5 | typedef OnFinishedBind = void Function(); 6 | 7 | abstract class BaseDI { 8 | void bind({OnFinishedBind? onFinishedBind}) { 9 | Logs().d('DI::bind() start binding'); 10 | setUp(getIt); 11 | 12 | onFinishedBind?.call(); 13 | } 14 | 15 | void setUp(GetIt get); 16 | } 17 | -------------------------------------------------------------------------------- /lib/di/global/hive_di.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/data/hive/hive_collection_tom_database.dart'; 2 | import 'package:fluffychat/di/base_di.dart'; 3 | import 'package:get_it/get_it.dart'; 4 | 5 | class HiveDI extends BaseDI { 6 | @override 7 | void setUp(GetIt get) { 8 | get.registerLazySingletonAsync( 9 | () => HiveCollectionToMDatabase.databaseBuilder(), 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/domain/app_state/direct_chat/create_direct_chat_failed.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/failure.dart'; 2 | 3 | class CreateDirectChatFailed extends Failure { 4 | final dynamic exception; 5 | 6 | const CreateDirectChatFailed({required this.exception}); 7 | 8 | @override 9 | List get props => [exception]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/app_state/direct_chat/create_direct_chat_loading.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | class CreateDirectChatLoading extends Success { 4 | const CreateDirectChatLoading(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | -------------------------------------------------------------------------------- /lib/domain/app_state/direct_chat/create_direct_chat_success.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | class CreateDirectChatSuccess extends Success { 4 | final String roomId; 5 | 6 | const CreateDirectChatSuccess({required this.roomId}); 7 | 8 | @override 9 | List get props => [roomId]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/app_state/preview_file/download_file_for_preview_failure.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/failure.dart'; 2 | 3 | class DownloadFileForPreviewFailure extends Failure { 4 | final dynamic exception; 5 | 6 | const DownloadFileForPreviewFailure({required this.exception}); 7 | 8 | @override 9 | List get props => [exception]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/app_state/preview_file/download_file_for_preview_loading.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | class DownloadFileForPreviewLoading extends Success { 4 | const DownloadFileForPreviewLoading(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | -------------------------------------------------------------------------------- /lib/domain/app_state/preview_url/get_preview_url_failure.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/failure.dart'; 2 | 3 | class GetPreviewURLFailure extends Failure { 4 | final dynamic exception; 5 | 6 | const GetPreviewURLFailure(this.exception) : super(); 7 | 8 | @override 9 | List get props => [exception]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/app_state/preview_url/get_preview_url_loading.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | class GetPreviewURLLoading extends Success { 4 | const GetPreviewURLLoading(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | -------------------------------------------------------------------------------- /lib/domain/app_state/recovery_words/get_recovery_words_failed.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/failure.dart'; 2 | 3 | class GetRecoveryWordsFailed extends Failure { 4 | final dynamic exception; 5 | 6 | const GetRecoveryWordsFailed({required this.exception}); 7 | 8 | @override 9 | List get props => [exception]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/app_state/recovery_words/get_recovery_words_success.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | import 'package:fluffychat/domain/model/recovery_words/recovery_words.dart'; 3 | 4 | class GetRecoveryWordsSuccess extends Success { 5 | final RecoveryWords words; 6 | 7 | const GetRecoveryWordsSuccess({required this.words}); 8 | 9 | @override 10 | List get props => [words]; 11 | } 12 | -------------------------------------------------------------------------------- /lib/domain/app_state/recovery_words/save_recovery_words_failed.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/failure.dart'; 2 | 3 | class SaveRecoveryWordsFailed extends Failure { 4 | final dynamic exception; 5 | 6 | const SaveRecoveryWordsFailed({this.exception}); 7 | 8 | @override 9 | List get props => [exception]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/app_state/recovery_words/save_recovery_words_success.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | class SaveRecoveryWordsSuccess extends Success { 4 | const SaveRecoveryWordsSuccess(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | -------------------------------------------------------------------------------- /lib/domain/app_state/room/update_group_chat_loading.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | class UpdateGroupChatLoading extends Success { 4 | const UpdateGroupChatLoading(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | -------------------------------------------------------------------------------- /lib/domain/app_state/send_files/send_files_failed.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/failure.dart'; 2 | 3 | class SendFilesFailed extends Failure { 4 | final dynamic exception; 5 | 6 | const SendFilesFailed({required this.exception}); 7 | 8 | @override 9 | List get props => [exception]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/app_state/send_files/send_files_loading.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | class SendFilesLoading extends Success { 4 | const SendFilesLoading(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | -------------------------------------------------------------------------------- /lib/domain/app_state/send_files/send_files_loading_with_placeholder.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | import 'package:fluffychat/presentation/extensions/send_file_extension.dart'; 3 | import 'package:matrix/matrix.dart'; 4 | 5 | class SendFilesLoadingWithPlaceholder extends Success { 6 | final Map txIdMapfileInfos; 7 | 8 | const SendFilesLoadingWithPlaceholder({required this.txIdMapfileInfos}); 9 | 10 | @override 11 | List get props => [txIdMapfileInfos]; 12 | } 13 | -------------------------------------------------------------------------------- /lib/domain/app_state/send_files/send_files_success.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | class SendFilesSuccess extends Success { 4 | final List? eventIds; 5 | 6 | const SendFilesSuccess({this.eventIds}); 7 | 8 | @override 9 | List get props => [eventIds]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/app_state/settings/update_profile_failure.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/failure.dart'; 2 | 3 | class UpdateProfileFailure extends Failure { 4 | final dynamic exception; 5 | 6 | const UpdateProfileFailure(this.exception) : super(); 7 | 8 | @override 9 | List get props => [exception]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/app_state/settings/update_profile_loading.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | class UpdateProfileLoading extends Success { 4 | const UpdateProfileLoading(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | -------------------------------------------------------------------------------- /lib/domain/app_state/validator/verify_name_view_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/presentation/state/failure.dart'; 2 | import 'package:fluffychat/presentation/state/success.dart'; 3 | 4 | class VerifyNameSuccessViewState extends UIState {} 5 | 6 | class VerifyNameFailure extends FeatureFailure { 7 | const VerifyNameFailure(dynamic exception) : super(exception: exception); 8 | } 9 | -------------------------------------------------------------------------------- /lib/domain/enums/pinned_messages_action_enum.dart: -------------------------------------------------------------------------------- 1 | enum PinnedMessagesActionEnum { 2 | pin, 3 | unpin, 4 | unpinAll, 5 | } 6 | -------------------------------------------------------------------------------- /lib/domain/exception/contacts/twake_lookup_exceptions.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class TwakeLookupChunkException with EquatableMixin implements Exception { 4 | final String? message; 5 | 6 | TwakeLookupChunkException(this.message); 7 | 8 | @override 9 | List get props => [message]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/exception/federation_configuration_not_found.dart: -------------------------------------------------------------------------------- 1 | class FederationConfigurationNotFound implements Exception { 2 | FederationConfigurationNotFound() : super(); 3 | } 4 | -------------------------------------------------------------------------------- /lib/domain/exception/invitation/invitation_status_not_found.dart: -------------------------------------------------------------------------------- 1 | class InvitationStatusNotFound implements Exception { 2 | final String userId; 3 | final String contactId; 4 | 5 | InvitationStatusNotFound({ 6 | required this.userId, 7 | required this.contactId, 8 | }) : super(); 9 | } 10 | -------------------------------------------------------------------------------- /lib/domain/exception/room/can_not_create_new_group_chat_exception.dart: -------------------------------------------------------------------------------- 1 | class CannotCreateNewGroupChatException implements Exception { 2 | CannotCreateNewGroupChatException() : super(); 3 | } 4 | -------------------------------------------------------------------------------- /lib/domain/exception/room/can_not_upload_content_exception.dart: -------------------------------------------------------------------------------- 1 | class CannotUploadContentException implements Exception { 2 | CannotUploadContentException() : super(); 3 | } 4 | -------------------------------------------------------------------------------- /lib/domain/exception/tom_configuration_not_found.dart: -------------------------------------------------------------------------------- 1 | class ToMConfigurationNotFound implements Exception { 2 | ToMConfigurationNotFound() : super(); 3 | } 4 | -------------------------------------------------------------------------------- /lib/domain/model/contact/contact_query.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:fluffychat/domain/model/query.dart'; 3 | 4 | class ContactQuery extends Query with EquatableMixin { 5 | ContactQuery({ 6 | required super.keyword, 7 | }); 8 | 9 | @override 10 | List get props => [keyword]; 11 | } 12 | -------------------------------------------------------------------------------- /lib/domain/model/contact/contact_status.dart: -------------------------------------------------------------------------------- 1 | enum ContactStatus { inactive, active } 2 | -------------------------------------------------------------------------------- /lib/domain/model/contact/contact_type.dart: -------------------------------------------------------------------------------- 1 | enum ContactType { internal, external } 2 | -------------------------------------------------------------------------------- /lib/domain/model/contact/third_party_status.dart: -------------------------------------------------------------------------------- 1 | enum ThirdPartyStatus { inactive, active } 2 | -------------------------------------------------------------------------------- /lib/domain/model/download_file/download_file_for_preview_response.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class DownloadFileForPreviewResponse with EquatableMixin { 4 | final String filePath; 5 | 6 | final String? mimeType; 7 | 8 | DownloadFileForPreviewResponse({ 9 | required this.filePath, 10 | this.mimeType, 11 | }); 12 | 13 | @override 14 | List get props => [filePath, mimeType]; 15 | } 16 | -------------------------------------------------------------------------------- /lib/domain/model/extensions/invitation/invitation_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/data/hive/dto/invitation_status/invitation_status_hive_obj.dart'; 2 | import 'package:fluffychat/domain/model/invitation/invitation_status.dart'; 3 | 4 | extension InvitationStatusExtension on InvitationStatus { 5 | InvitationStatusHiveObj toHiveObj() { 6 | return InvitationStatusHiveObj( 7 | invitationId: invitationId, 8 | contactId: contactId, 9 | ); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/domain/model/extensions/linagora_app_extensions.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/app_grid/linagora_app.dart'; 2 | 3 | extension LinagoraAppExtension on LinagoraApp { 4 | String getDisplayAppName() { 5 | switch (appName) { 6 | case 'Twake Mail': 7 | return 'Mail'; 8 | case 'Twake Drive': 9 | return 'Drive'; 10 | default: 11 | return appName; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/domain/model/extensions/string_extension.dart: -------------------------------------------------------------------------------- 1 | extension StringExtension on String { 2 | String get ellipsizeFileName { 3 | return length > 30 4 | ? '${substring(0, 15)}...${substring(length - 15)}' 5 | : this; 6 | } 7 | 8 | String get displayMentioned { 9 | return '@[$this]'; 10 | } 11 | 12 | String get convertToHttps { 13 | final domain = split(':').first; 14 | return 'https://$domain/'; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/domain/model/invitation/invitation_medium_enum.dart: -------------------------------------------------------------------------------- 1 | enum InvitationMediumEnum { 2 | email, 3 | phone; 4 | 5 | String get value { 6 | switch (this) { 7 | case InvitationMediumEnum.email: 8 | return 'email'; 9 | case InvitationMediumEnum.phone: 10 | return 'phone'; 11 | default: 12 | throw Exception('Unknown InvitationMediumEnum value'); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/domain/model/invitation/invitation_status.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class InvitationStatus with EquatableMixin { 4 | final String invitationId; 5 | final String contactId; 6 | 7 | InvitationStatus({ 8 | required this.invitationId, 9 | required this.contactId, 10 | }); 11 | 12 | @override 13 | List get props => [ 14 | invitationId, 15 | contactId, 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /lib/domain/model/preview_file/document_uti.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class DocumentUti with EquatableMixin { 4 | final String? value; 5 | 6 | DocumentUti(this.value); 7 | 8 | @override 9 | List get props => [value]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/model/query.dart: -------------------------------------------------------------------------------- 1 | abstract class Query { 2 | final String keyword; 3 | 4 | Query({required this.keyword}); 5 | } 6 | -------------------------------------------------------------------------------- /lib/domain/model/recovery_words/recovery_words.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class RecoveryWords with EquatableMixin { 4 | final String words; 5 | 6 | RecoveryWords(this.words); 7 | 8 | @override 9 | List get props => [words]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/model/search/contact_search_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/search/search_model.dart'; 2 | 3 | class ContactSearchModel extends SearchModel { 4 | final String? matrixId; 5 | 6 | final String? email; 7 | 8 | const ContactSearchModel( 9 | this.matrixId, 10 | this.email, { 11 | super.displayName, 12 | }); 13 | 14 | @override 15 | String get id => matrixId ?? email ?? ''; 16 | 17 | @override 18 | List get props => [matrixId, email, displayName]; 19 | } 20 | -------------------------------------------------------------------------------- /lib/domain/model/search/search_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | abstract class SearchModel extends Equatable { 4 | final String? displayName; 5 | 6 | final String? directChatMatrixID; 7 | 8 | String get id; 9 | 10 | const SearchModel({ 11 | this.directChatMatrixID, 12 | this.displayName, 13 | }); 14 | } 15 | -------------------------------------------------------------------------------- /lib/domain/model/verification/new_name_request.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class NewNameRequest with EquatableMixin { 4 | final String? value; 5 | 6 | NewNameRequest(this.value); 7 | 8 | @override 9 | List get props => [value]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/model/verification/validator.dart: -------------------------------------------------------------------------------- 1 | import 'package:dartz/dartz.dart'; 2 | import 'package:fluffychat/app_state/failure.dart'; 3 | import 'package:fluffychat/app_state/success.dart'; 4 | 5 | abstract class Validator { 6 | Either validate(T value); 7 | } 8 | -------------------------------------------------------------------------------- /lib/domain/repository/contact/address_book_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/data/model/addressbook/address_book_request.dart'; 2 | import 'package:fluffychat/data/model/addressbook/address_book_response.dart'; 3 | 4 | abstract class AddressBookRepository { 5 | Future getAddressBook(); 6 | 7 | Future updateAddressBook({ 8 | required AddressBookRequest request, 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /lib/domain/repository/contact/hive_contact_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/contact/contact.dart'; 2 | 3 | abstract class HiveContactRepository { 4 | Future> getThirdPartyContactByUserId(String userId); 5 | 6 | Future saveThirdPartyContactsForUser( 7 | String userId, 8 | List contacts, 9 | ); 10 | 11 | Future deleteThirdPartyContactBox(); 12 | } 13 | -------------------------------------------------------------------------------- /lib/domain/repository/federation_configurations_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/data/model/federation_server/federation_configuration.dart'; 2 | 3 | abstract class FederationConfigurationsRepository { 4 | Future getFederationConfigurations(String userId); 5 | 6 | Future saveFederationConfigurations( 7 | String userId, 8 | FederationConfigurations federationConfigurations, 9 | ); 10 | 11 | Future deleteFederationConfigurations(String userId); 12 | } 13 | -------------------------------------------------------------------------------- /lib/domain/repository/localizations/localizations_repository.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | abstract class LocalizationsRepository { 4 | Future persistLanguage(Locale localeCurrent); 5 | } 6 | -------------------------------------------------------------------------------- /lib/domain/repository/media/media_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/media/url_preview.dart'; 2 | 3 | abstract class MediaRepository { 4 | Future getUrlPreview({ 5 | required Uri uri, 6 | int? preferredPreviewTime, 7 | }); 8 | } 9 | -------------------------------------------------------------------------------- /lib/domain/repository/multiple_account/multiple_account_repository.dart: -------------------------------------------------------------------------------- 1 | abstract class MultipleAccountRepository { 2 | Future storePersistActiveAccount(String userId); 3 | 4 | Future getPersistActiveAccount(); 5 | 6 | Future deletePersistActiveAccount(); 7 | } 8 | -------------------------------------------------------------------------------- /lib/domain/repository/phonebook_contact_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/contact/contact.dart'; 2 | 3 | abstract class PhonebookContactRepository { 4 | Future> fetchContacts(); 5 | } 6 | -------------------------------------------------------------------------------- /lib/domain/repository/reactions/reactions_repository.dart: -------------------------------------------------------------------------------- 1 | abstract class ReactionsRepository { 2 | Future storeRecentReactions(List recentReactions); 3 | 4 | Future> getRecentReactions(); 5 | 6 | Future removeRecentReactions(); 7 | } 8 | -------------------------------------------------------------------------------- /lib/domain/repository/recovery_words_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/recovery_words/recovery_words.dart'; 2 | 3 | abstract class RecoveryWordsRepository { 4 | Future getRecoveryWords(); 5 | 6 | Future saveRecoveryWords(String recoveryWords); 7 | 8 | Future deleteRecoveryWords(); 9 | } 10 | -------------------------------------------------------------------------------- /lib/domain/repository/server_config_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:matrix/matrix.dart'; 2 | 3 | abstract class ServerConfigRepository { 4 | Future getServerConfig(); 5 | } 6 | -------------------------------------------------------------------------------- /lib/domain/repository/server_search_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/data/model/search/server_search_response.dart'; 2 | import 'package:matrix/matrix.dart'; 3 | 4 | abstract class ServerSearchRepository { 5 | Future search({ 6 | required Categories searchCategories, 7 | String? nextBatch, 8 | }); 9 | } 10 | -------------------------------------------------------------------------------- /lib/domain/repository/tom_configurations_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/tom_configurations.dart'; 2 | 3 | abstract class ToMConfigurationsRepository { 4 | Future getTomConfigurations(String userId); 5 | 6 | Future saveTomConfigurations( 7 | String userId, 8 | ToMConfigurations toMConfigurations, 9 | ); 10 | 11 | Future deleteTomConfigurations(String userId); 12 | } 13 | -------------------------------------------------------------------------------- /lib/domain/usecase/contacts/twake_look_up_argument.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class TwakeLookUpArgument with EquatableMixin { 4 | final String homeServerUrl; 5 | final String withAccessToken; 6 | 7 | TwakeLookUpArgument({ 8 | required this.homeServerUrl, 9 | required this.withAccessToken, 10 | }); 11 | 12 | @override 13 | List get props => [ 14 | homeServerUrl, 15 | withAccessToken, 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /lib/domain/usecase/invitation/constants.dart: -------------------------------------------------------------------------------- 1 | class Constants { 2 | static const String invalidPhoneNumberMessage = 'Invalid phone number'; 3 | static const String invalidEmailMessage = 'Invalid email'; 4 | static const String alreadySentInvitationMessage = 5 | 'You already sent an invitation to this contact'; 6 | } 7 | -------------------------------------------------------------------------------- /lib/domain/usecase/lazy_load_interactor.dart: -------------------------------------------------------------------------------- 1 | mixin LazyLoadDataMixin { 2 | LazyLoadInfos calculateLazyLoadInfo({ 3 | required int length, 4 | required int offset, 5 | required int limit, 6 | }) { 7 | final isEnd = length < limit; 8 | return LazyLoadInfos(isEnd: isEnd, offset: isEnd ? offset : offset + limit); 9 | } 10 | } 11 | 12 | class LazyLoadInfos { 13 | final bool isEnd; 14 | final int offset; 15 | 16 | LazyLoadInfos({required this.isEnd, required this.offset}); 17 | } 18 | -------------------------------------------------------------------------------- /lib/event/twake_event_messages.dart: -------------------------------------------------------------------------------- 1 | class TwakeEventMessages { 2 | static Map>> 3 | updateAddressBookMessage(String clientId, String senderDeviceId) { 4 | return { 5 | clientId: { 6 | '*': { 7 | 'action': 'update_address_book', 8 | 'sender_device_id': senderDeviceId, 9 | }, 10 | }, 11 | }; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/event/twake_event_types.dart: -------------------------------------------------------------------------------- 1 | class TwakeEventTypes { 2 | static const String shareFileEventType = 'app.twake.shared.file'; 3 | static const String addressBookUpdatedEventType = 4 | 'app.twake.addressbook.updated'; 5 | } 6 | -------------------------------------------------------------------------------- /lib/event/twake_inapp_event_types.dart: -------------------------------------------------------------------------------- 1 | class TwakeInappEventTypes { 2 | static const String uploadAvatarEvent = 'app.twake.inapp.profile.avatar'; 3 | } 4 | -------------------------------------------------------------------------------- /lib/migrate_steps/migrate_steps.dart: -------------------------------------------------------------------------------- 1 | abstract class MigrateSteps { 2 | const MigrateSteps(); 3 | 4 | Future onMigrate(int currentVersion, int newVersion) async {} 5 | } 6 | -------------------------------------------------------------------------------- /lib/modules/federation_identity_lookup/domain/exceptions/federation_identity_lookup_exceptions.dart: -------------------------------------------------------------------------------- 1 | class LookUpFederationIdentityNotFoundException implements Exception { 2 | final dynamic error; 3 | 4 | LookUpFederationIdentityNotFoundException(this.error); 5 | 6 | @override 7 | String toString() { 8 | return 'LookUpFederationIdentityNotFoundException $error'; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/modules/federation_identity_request_token/data/datasource/federation_identity_request_token_datasource.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/modules/federation_identity_request_token/domain/models/federation_token_information.dart'; 2 | 3 | abstract class FederationIdentityRequestTokenDatasource { 4 | Future requestToken({ 5 | required String mxid, 6 | }); 7 | } 8 | -------------------------------------------------------------------------------- /lib/modules/federation_identity_request_token/domain/repository/federation_identity_request_token_repository.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/modules/federation_identity_request_token/domain/models/federation_token_information.dart'; 2 | 3 | abstract class FederationIdentityRequestTokenRepository { 4 | Future requestToken({ 5 | required String mxid, 6 | }); 7 | } 8 | -------------------------------------------------------------------------------- /lib/pages/chat/chat_loading_view_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/di/global/get_it_initializer.dart'; 2 | import 'package:fluffychat/utils/responsive/responsive_utils.dart'; 3 | import 'package:flutter/material.dart'; 4 | 5 | class ChatLoadingViewStyle { 6 | static ResponsiveUtils responsive = getIt.get(); 7 | 8 | static EdgeInsets padding(BuildContext context) => EdgeInsets.symmetric( 9 | vertical: 8, 10 | horizontal: responsive.isMobile(context) ? 8 : 16, 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /lib/pages/chat/chat_pinned_events/pinned_events_argument.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:matrix/matrix.dart'; 3 | 4 | class PinnedEventsArgument with EquatableMixin { 5 | final List pinnedEvents; 6 | 7 | final Timeline? timeline; 8 | 9 | PinnedEventsArgument({required this.pinnedEvents, this.timeline}); 10 | 11 | @override 12 | List get props => [pinnedEvents, timeline]; 13 | } 14 | -------------------------------------------------------------------------------- /lib/pages/chat/context_item_chat_action.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/pages/chat/chat_horizontal_action_menu.dart'; 2 | import 'package:fluffychat/widgets/context_menu/context_menu_action_item.dart'; 3 | 4 | class ContextMenuItemChatAction 5 | extends ContextMenuItemAction { 6 | ContextMenuItemChatAction(super.action, super.state); 7 | } 8 | -------------------------------------------------------------------------------- /lib/pages/chat/disabled_chat_input_row_style.dart: -------------------------------------------------------------------------------- 1 | class DisabledChatInputRowStyle { 2 | static const double chatDisabledBottomBarPadding = 16.0; 3 | static const double chatDisabledBottomBarHeight = 96.0; 4 | static const double chatDisabledBottomBarIconSize = 24.0; 5 | static const double chatDisabledBottomBarIconSpacing = 8.0; 6 | } 7 | -------------------------------------------------------------------------------- /lib/pages/chat/events/button_content_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ButtonContentStyle { 4 | static const EdgeInsets parentPadding = EdgeInsets.only( 5 | left: 2, 6 | right: 8, 7 | ); 8 | static const EdgeInsets leadingIconPadding = EdgeInsets.all(5); 9 | static const double leadingIconSize = 20; 10 | static const double leadingAndTextGap = 8; 11 | static const double textMaxWidth = 165; 12 | } 13 | -------------------------------------------------------------------------------- /lib/pages/chat/events/download_video_state.dart: -------------------------------------------------------------------------------- 1 | enum DownloadVideoState { 2 | initial, 3 | loading, 4 | done, 5 | failed, 6 | } 7 | -------------------------------------------------------------------------------- /lib/pages/chat/events/message_content_mixin.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/pages/chat/event_info_dialog.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:matrix/matrix.dart'; 4 | 5 | mixin MessageContentMixin { 6 | void showEventInfo(BuildContext context, Event event) => 7 | event.showInfoDialog(context); 8 | } 9 | -------------------------------------------------------------------------------- /lib/pages/chat/events/message_reactions_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class MessageReactionsStyle { 4 | static double get moreReactionContainer => 28.0; 5 | static double get moreReactionIconSize => 20.0; 6 | static double get loadingReactionSize => 28.0; 7 | 8 | static Color get reactionBorderColor => Colors.white; 9 | static double get reactionBorderRadius => 16.0; 10 | 11 | static double get renderKeyFontSize => 20; 12 | static Color get borderColor => Colors.white; 13 | } 14 | -------------------------------------------------------------------------------- /lib/pages/chat/reply_display_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | 3 | class ReplyDisplayStyle { 4 | static const EdgeInsets replyDisplayPadding = EdgeInsets.only( 5 | top: 8.0, 6 | ); 7 | 8 | static const EdgeInsets iconEditPadding = EdgeInsets.only( 9 | right: 16.0, 10 | ); 11 | 12 | static const EdgeInsets iconClosePadding = EdgeInsets.only( 13 | left: 8.0, 14 | ); 15 | 16 | static const double replyContainerHeight = 60; 17 | } 18 | -------------------------------------------------------------------------------- /lib/pages/chat_adaptive_scaffold/chat_adaptive_scaffold_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ChatAdaptiveScaffoldStyle { 4 | static const webPaddingRight = EdgeInsetsDirectional.only(end: 16); 5 | static final borderRadius = BorderRadius.circular(16); 6 | } 7 | -------------------------------------------------------------------------------- /lib/pages/chat_details/chat_details_page_view/files/chat_details_files_page_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ChatDetailsFilesPageStyle { 4 | const ChatDetailsFilesPageStyle(); 5 | 6 | static EdgeInsets horizontalPadding = 7 | const EdgeInsets.symmetric(horizontal: 8.0); 8 | } 9 | -------------------------------------------------------------------------------- /lib/pages/chat_draft/draft_chat_empty_widget_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:linagora_design_flutter/colors/linagora_sys_colors.dart'; 3 | 4 | class DraftChatEmptyWidgetStyle { 5 | static Color greetingButtonBackground = 6 | LinagoraSysColors.material().onSurface.withOpacity(0.08); 7 | } 8 | -------------------------------------------------------------------------------- /lib/pages/chat_list/chat_list_bottom_navigator_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ChatListBottomNavigatorStyle { 4 | static const EdgeInsetsDirectional padding = EdgeInsetsDirectional.symmetric( 5 | horizontal: 8, 6 | vertical: 12, 7 | ); 8 | 9 | static const EdgeInsetsDirectional paddingIcon = EdgeInsetsDirectional.only( 10 | bottom: 8, 11 | ); 12 | 13 | static const double width = 86; 14 | static const double iconSize = 24; 15 | } 16 | -------------------------------------------------------------------------------- /lib/pages/chat_list/chat_list_skeletonizer_style.dart: -------------------------------------------------------------------------------- 1 | class ChatListSkeletonizerStyle { 2 | static const double iconSize = 56; 3 | static const int itemCount = 100; 4 | 5 | static const String titleHardCode = 'Title hard code'; 6 | static const String subtitleHardCode = 'Subtitle hard code .............'; 7 | } 8 | -------------------------------------------------------------------------------- /lib/pages/chat_list/client_chooser_button_style.dart: -------------------------------------------------------------------------------- 1 | class ClientChooserButtonStyle { 2 | static double get avatarSizeInAppBar => 40.0; 3 | static double get avatarFontSizeInAppBar => 17.0; 4 | 5 | static double get dropDownIconSize => 20.0; 6 | } 7 | -------------------------------------------------------------------------------- /lib/pages/connect/connect_page_view_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ConnectPageViewStyle { 4 | static const EdgeInsets padding = EdgeInsets.all(12.0); 5 | 6 | static const double iconSize = 32; 7 | } 8 | -------------------------------------------------------------------------------- /lib/pages/connect/sso_login_state.dart: -------------------------------------------------------------------------------- 1 | enum SsoLoginState { 2 | success, 3 | error, 4 | tokenEmpty, 5 | } 6 | -------------------------------------------------------------------------------- /lib/pages/contacts_tab/contacts_invitation_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ContactsInvitationStyle { 4 | static const EdgeInsetsGeometry padding = EdgeInsets.symmetric( 5 | horizontal: 16, 6 | ); 7 | 8 | static const EdgeInsetsGeometry verticalPadding = EdgeInsets.symmetric( 9 | vertical: 16, 10 | ); 11 | 12 | static const double heightSendButton = 48; 13 | 14 | static const BorderRadiusGeometry borderRadius = BorderRadius.all( 15 | Radius.circular(100), 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /lib/pages/contacts_tab/contacts_tab_view_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ContactsTabViewStyle { 4 | static const Size preferredSizeAppBar = Size.fromHeight(120); 5 | static const double padding = 8.0; 6 | 7 | static const double loadingSpacer = 16; 8 | static const double avatarSize = 56.0; 9 | } 10 | -------------------------------------------------------------------------------- /lib/pages/dialer/pip/dismiss_keyboard.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | void dismissKeyboard(BuildContext context) { 4 | if (ModalRoute.of(context)?.isCurrent == true) { 5 | if (FocusManager.instance.primaryFocus?.hasFocus == true) { 6 | FocusManager.instance.primaryFocus?.unfocus(); 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/pages/forward/forward_item_style.dart: -------------------------------------------------------------------------------- 1 | class ForwardItemStyle { 2 | static double get avatarSize => 40.0; 3 | static double get selectedContainerSize => 20.0; 4 | static double get selectedIconSize => 16.0; 5 | } 6 | -------------------------------------------------------------------------------- /lib/pages/forward/forward_web_view_style.dart: -------------------------------------------------------------------------------- 1 | class ForwardWebViewStyle { 2 | static const double dialogHeight = 638; 3 | static const double dialogWidth = 448; 4 | static const double dialogBorderRadius = 16.0; 5 | } 6 | -------------------------------------------------------------------------------- /lib/pages/forward/recent_chat_list_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class RecentChatListStyle { 4 | static BorderRadius borderRadiusItem = BorderRadius.circular(16); 5 | 6 | static const paddingVerticalBetweenItem = EdgeInsetsDirectional.only( 7 | top: 8.0, 8 | bottom: 8.0, 9 | ); 10 | 11 | static const paddingHorizontalBetweenItem = EdgeInsetsDirectional.only( 12 | start: 8.0, 13 | end: 6.0, 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /lib/pages/homeserver_picker/homeserver_state.dart: -------------------------------------------------------------------------------- 1 | enum HomeserverState { 2 | loading, 3 | ssoLoginServer, 4 | otherLoginMethod, 5 | wrongServerName, 6 | } 7 | -------------------------------------------------------------------------------- /lib/pages/image_viewer/context_menu_item_image_viewer_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ContextMenuItemImageViewerStyle { 4 | static const double width = 200; 5 | 6 | static const double height = 48; 7 | 8 | static const double dividerHeight = 1; 9 | 10 | static Color dividerColor(BuildContext context) => 11 | Theme.of(context).colorScheme.surfaceTint.withOpacity(0.16); 12 | 13 | static SizedBox get paddingBetweenItems => const SizedBox(width: 12); 14 | } 15 | -------------------------------------------------------------------------------- /lib/pages/image_viewer/image_viewer_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/utils/platform_infos.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class ImageViewerStyle { 5 | static const double minScaleInteractiveViewer = 1.0; 6 | static const double maxScaleInteractiveViewer = 10.0; 7 | static double? appBarHeight = PlatformInfos.isWeb ? 56 : null; 8 | static EdgeInsetsGeometry paddingTopAppBar = EdgeInsetsDirectional.only( 9 | top: PlatformInfos.isWeb ? 0 : 56, 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /lib/pages/invitation_selection/invitation_selection_style.dart: -------------------------------------------------------------------------------- 1 | class InvitationSelectionStyle { 2 | static const double dialogHeight = 638; 3 | static const double dialogWidth = 448; 4 | static const double dialogBorderRadius = 16.0; 5 | } 6 | -------------------------------------------------------------------------------- /lib/pages/new_private_chat/new_private_chat_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class NewPrivateChatStyle { 4 | static const EdgeInsets paddingBody = EdgeInsets.only(left: 8.0, right: 10.0); 5 | 6 | static const EdgeInsets paddingWarningBanner = EdgeInsets.only(top: 16.0); 7 | } 8 | -------------------------------------------------------------------------------- /lib/pages/profile_info/copiable_profile_row/copiable_profile_row_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/widgets.dart'; 2 | 3 | class CopiableProfileRowStyle { 4 | static const double spacerBetweenLeadingIconAndContent = 8; 5 | static const double borderOpacity = 0.16; 6 | static const double textColumnBottomPadding = 16; 7 | 8 | static const EdgeInsets ripplePadding = EdgeInsets.all(8.0); 9 | static BorderRadiusGeometry rippleRadius = BorderRadius.circular(8); 10 | } 11 | -------------------------------------------------------------------------------- /lib/pages/profile_info/profile_info_view_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ProfileInfoViewStyle { 4 | static const EdgeInsetsGeometry backIconPadding = 5 | EdgeInsets.symmetric(vertical: 8, horizontal: 4); 6 | static const EdgeInsets navigationAppBarPadding = 7 | EdgeInsets.symmetric(horizontal: 4.0, vertical: 8.0); 8 | } 9 | -------------------------------------------------------------------------------- /lib/pages/search/recent_contacts_banner_widget_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | 3 | class RecentContactsBannerWidgetStyle { 4 | static double get chatRecentContactItemWidth => 72.0; 5 | static double get avatarWidthSize => 48.0; 6 | 7 | static EdgeInsetsGeometry get chatRecentContactItemPadding => 8 | const EdgeInsets.only(top: 8, right: 4, left: 4); 9 | static EdgeInsetsDirectional get chatRecentContactHorizontalPadding => 10 | const EdgeInsetsDirectional.symmetric(horizontal: 8); 11 | } 12 | -------------------------------------------------------------------------------- /lib/pages/search/recent_item_widget_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class RecentItemStyle { 4 | static EdgeInsetsGeometry get paddingRecentItem => const EdgeInsets.all(8); 5 | 6 | static double get avatarSize => 56.0; 7 | 8 | static const double recentItemHeight = 80; 9 | } 10 | -------------------------------------------------------------------------------- /lib/pages/search/search_external_contact_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class SearchExternalContactStyle { 4 | static EdgeInsetsGeometry contentPadding = const EdgeInsets.symmetric( 5 | horizontal: 16, 6 | vertical: 12, 7 | ); 8 | 9 | static BorderRadius borderRadius = BorderRadius.circular(8.0); 10 | } 11 | -------------------------------------------------------------------------------- /lib/pages/search/server_search_view_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class ServerSearchViewStyle { 4 | static EdgeInsetsGeometry paddingListItem = const EdgeInsets.all(8.0); 5 | 6 | static EdgeInsetsGeometry paddingInsideListItem = const EdgeInsets.all(8.0); 7 | 8 | static BorderRadius itemBorderRadius = BorderRadius.circular(8.0); 9 | 10 | static EdgeInsetsGeometry paddingAvatar = const EdgeInsets.only(right: 12.0); 11 | } 12 | -------------------------------------------------------------------------------- /lib/pages/settings_dashboard/settings_app_language/settings_app_language_view_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class SettingsAppLanguageViewStyle { 4 | static const double borderRadius = 20; 5 | static const double iconSize = 28; 6 | 7 | static const EdgeInsets paddingBody = EdgeInsets.symmetric(horizontal: 16); 8 | static const EdgeInsets paddingListItems = EdgeInsets.only( 9 | top: 16, 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /lib/pages/settings_dashboard/settings_chat/settings_chat.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'settings_chat_view.dart'; 4 | 5 | class SettingsChat extends StatefulWidget { 6 | const SettingsChat({super.key}); 7 | 8 | @override 9 | SettingsChatController createState() => SettingsChatController(); 10 | } 11 | 12 | class SettingsChatController extends State { 13 | @override 14 | Widget build(BuildContext context) => SettingsChatView(this); 15 | } 16 | -------------------------------------------------------------------------------- /lib/pages/settings_dashboard/settings_profile/settings_profile_item_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class SettingsProfileItemStyle { 4 | static const double iconSize = 24.0; 5 | static const double dividerSize = 2.0; 6 | 7 | static const EdgeInsetsDirectional itemBuilderPadding = 8 | EdgeInsetsDirectional.only(end: 8.0); 9 | } 10 | -------------------------------------------------------------------------------- /lib/pages/settings_dashboard/settings_profile/settings_profile_state/settings_profile_ui_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/presentation/state/success.dart'; 2 | 3 | abstract class SettingsProfileUIState extends UIState {} 4 | -------------------------------------------------------------------------------- /lib/pages/twake_welcome/twake_welcome_view_style.dart: -------------------------------------------------------------------------------- 1 | class TwakeWelcomeViewStyle { 2 | static const double logoWidth = 225; 3 | static const double logoHeight = 147; 4 | } 5 | -------------------------------------------------------------------------------- /lib/presentation/decorators/chat_list/subtitle_image_preview_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class SubtitleImagePreviewStyle { 4 | static const double width = 20; 5 | static const double height = 20; 6 | static const double borderRadius = 4; 7 | static const BoxFit fit = BoxFit.fill; 8 | static const EdgeInsets labelPadding = EdgeInsets.only(left: 5); 9 | } 10 | -------------------------------------------------------------------------------- /lib/presentation/decorators/chat_list/subtitle_text_style_decorator/subtitle_text_style_component.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:matrix/matrix.dart'; 3 | 4 | abstract class ChatListSubtitleTextStyleComponent { 5 | TextStyle textStyle(Room room, BuildContext context); 6 | } 7 | -------------------------------------------------------------------------------- /lib/presentation/decorators/chat_list/title_text_style_decorator/title_text_style_component.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:matrix/matrix.dart'; 3 | 4 | abstract class ChatListTitleTextStyleComponent { 5 | TextStyle textStyle(Room room); 6 | } 7 | -------------------------------------------------------------------------------- /lib/presentation/decorators/chat_list/title_text_style_decorator/title_text_style_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/presentation/decorators/chat_list/title_text_style_decorator/title_text_style_decorator.dart'; 2 | 3 | class ChatLitTitleTextStyleView { 4 | static ChatListTitleTextStyle textStyle = ChatListTitleTextStyle( 5 | MuteChatListTitleTextStyleDecorator( 6 | UnreadChatListTitleTextStyleDecorator( 7 | ReadChatListTitleTextStyleDecorator(), 8 | ), 9 | ), 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /lib/presentation/enum/chat/chat_details_screen_enum.dart: -------------------------------------------------------------------------------- 1 | enum ChatDetailsScreenEnum { group, direct } 2 | -------------------------------------------------------------------------------- /lib/presentation/enum/chat/media_viewer_popup_result_enum.dart: -------------------------------------------------------------------------------- 1 | enum MediaViewerPopupResultEnum { 2 | closeRightColumnFlag, 3 | } 4 | -------------------------------------------------------------------------------- /lib/presentation/enum/chat/popup_menu_item_web_enum.dart: -------------------------------------------------------------------------------- 1 | enum InputBarContextMenu { 2 | copy, 3 | cut, 4 | paste, 5 | } 6 | -------------------------------------------------------------------------------- /lib/presentation/enum/chat/right_column_type_enum.dart: -------------------------------------------------------------------------------- 1 | enum RightColumnType { 2 | search, 3 | profileInfo, 4 | groupChatDetails, 5 | } 6 | -------------------------------------------------------------------------------- /lib/presentation/enum/chat/send_media_with_caption_status_enum.dart: -------------------------------------------------------------------------------- 1 | enum SendMediaWithCaptionStatus { 2 | cancel, 3 | done, 4 | emptyRoom, 5 | } 6 | -------------------------------------------------------------------------------- /lib/presentation/enum/contacts/warning_contacts_banner_enum.dart: -------------------------------------------------------------------------------- 1 | enum WarningContactsBannerState { 2 | display, 3 | hide, 4 | notDisplayAgain, 5 | } 6 | -------------------------------------------------------------------------------- /lib/presentation/enum/settings/settings_action_enum.dart: -------------------------------------------------------------------------------- 1 | enum SettingsAction { 2 | addAccount, 3 | newStory, 4 | newSpace, 5 | invite, 6 | settings, 7 | archive, 8 | } 9 | -------------------------------------------------------------------------------- /lib/presentation/extensions/go_router_extensions.dart: -------------------------------------------------------------------------------- 1 | import 'package:go_router/go_router.dart'; 2 | 3 | extension GoRouterExtensions on GoRouter { 4 | String? get activeRoomId { 5 | try { 6 | final path = routeInformationProvider.value.uri.path; 7 | if (path.isEmpty) return null; 8 | if (!path.startsWith('/rooms/')) return null; 9 | return path.split('/')[2]; 10 | } catch (e) { 11 | return null; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/presentation/extensions/room_summary_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:matrix/matrix.dart'; 2 | 3 | extension RoomSummaryExtension on RoomSummary { 4 | int get actualMembersCount => 5 | (mInvitedMemberCount ?? 0) + (mJoinedMemberCount ?? 0); 6 | } 7 | -------------------------------------------------------------------------------- /lib/presentation/extensions/value_notifier_custom.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | 3 | class ValueNotifierCustom extends ValueNotifier { 4 | bool _isDisposed = false; 5 | 6 | ValueNotifierCustom(super.value); 7 | 8 | bool get isDisposed => _isDisposed; 9 | 10 | @override 11 | void dispose() { 12 | _isDisposed = true; 13 | super.dispose(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/presentation/mixins/comparable_presentation_search_mixin.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/presentation/model/search/presentation_search.dart'; 2 | 3 | mixin ComparablePresentationSearchMixin { 4 | int comparePresentationSearch( 5 | PresentationSearch searchResultOne, 6 | PresentationSearch searchResultTwo, 7 | ) { 8 | return searchResultOne.toString().compareTo(searchResultTwo.toString()); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/presentation/model/chat/events/message/message_metrics.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class MessageMetrics extends Equatable { 4 | final double totalMessageWidth; 5 | final bool isNeedAddNewLine; 6 | 7 | const MessageMetrics({ 8 | required this.totalMessageWidth, 9 | required this.isNeedAddNewLine, 10 | }); 11 | 12 | @override 13 | List get props => [ 14 | totalMessageWidth, 15 | isNeedAddNewLine, 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /lib/presentation/model/chat/image_viewer_argument.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/presentation/model/pop_result.dart'; 2 | 3 | class ImageViewerArgument extends PopResult { 4 | final String? showInChatEventId; 5 | 6 | final String? roomId; 7 | 8 | ImageViewerArgument({ 9 | this.showInChatEventId, 10 | this.roomId, 11 | }); 12 | 13 | @override 14 | List get props => [roomId, showInChatEventId]; 15 | } 16 | -------------------------------------------------------------------------------- /lib/presentation/model/clipboard/clipboard_image_info.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:flutter/services.dart'; 3 | 4 | class ClipboardImageInfo with EquatableMixin { 5 | final Stream stream; 6 | 7 | final String? fileName; 8 | 9 | final int? fileSize; 10 | 11 | ClipboardImageInfo({ 12 | required this.stream, 13 | this.fileName, 14 | this.fileSize, 15 | }); 16 | 17 | @override 18 | List get props => [stream, fileName, fileSize]; 19 | } 20 | -------------------------------------------------------------------------------- /lib/presentation/model/contact/get_presentation_contacts_empty.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/failure.dart'; 2 | 3 | class GetPresentationContactsEmpty extends Failure { 4 | final String? keyword; 5 | 6 | const GetPresentationContactsEmpty({ 7 | this.keyword, 8 | }); 9 | 10 | @override 11 | List get props => [keyword]; 12 | } 13 | -------------------------------------------------------------------------------- /lib/presentation/model/contact/get_presentation_contacts_failure.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/failure.dart'; 2 | 3 | class GetPresentationContactsFailure extends Failure { 4 | final String keyword; 5 | 6 | const GetPresentationContactsFailure({required this.keyword}); 7 | 8 | @override 9 | List get props => [keyword]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/presentation/model/contact/presentation_contact_constant.dart: -------------------------------------------------------------------------------- 1 | class PresentationContactConstant { 2 | static const String receiverId = 'receiverId'; 3 | static const String email = 'email'; 4 | static const String displayName = 'displayName'; 5 | static const String status = 'status'; 6 | } 7 | -------------------------------------------------------------------------------- /lib/presentation/model/file/display_image_info.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:flutter/widgets.dart'; 3 | 4 | class DisplayImageInfo with EquatableMixin { 5 | final Size size; 6 | final bool hasBlur; 7 | 8 | DisplayImageInfo({ 9 | required this.size, 10 | required this.hasBlur, 11 | }); 12 | 13 | @override 14 | List get props => [size, hasBlur]; 15 | } 16 | -------------------------------------------------------------------------------- /lib/presentation/model/forward/forward_argument.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/config/go_routes/router_arguments.dart'; 2 | 3 | class ForwardArgument extends RouterArguments { 4 | final String fromRoomId; 5 | 6 | ForwardArgument({ 7 | required this.fromRoomId, 8 | }); 9 | 10 | @override 11 | List get props => [fromRoomId]; 12 | } 13 | -------------------------------------------------------------------------------- /lib/presentation/model/image_type.dart: -------------------------------------------------------------------------------- 1 | enum ImageType { 2 | heic(name: 'image/heic'), 3 | png(name: 'image/png'), 4 | jpg(name: 'image/jpg'); 5 | 6 | const ImageType({required this.name}); 7 | 8 | final String name; 9 | } 10 | -------------------------------------------------------------------------------- /lib/presentation/model/pop_result.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class PopResult with EquatableMixin { 4 | const PopResult(); 5 | 6 | @override 7 | List get props => []; 8 | } 9 | -------------------------------------------------------------------------------- /lib/presentation/model/pop_result_from_forward.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/presentation/model/pop_result.dart'; 2 | 3 | class PopResultFromForward extends PopResult { 4 | const PopResultFromForward(); 5 | } 6 | -------------------------------------------------------------------------------- /lib/presentation/model/search/presentation_search_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/presentation/model/contact/get_presentation_contacts_success.dart'; 2 | import 'package:fluffychat/presentation/model/search/presentation_search.dart'; 3 | 4 | typedef GetContactAndRecentChatPresentation 5 | = GetPresentationContactsSuccess; 6 | -------------------------------------------------------------------------------- /lib/presentation/model/search/presentation_server_side_empty_search.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/presentation/model/search/presentation_server_side_state.dart'; 2 | 3 | class PresentationServerSideEmptySearch extends PresentationServerSideUIState { 4 | @override 5 | List get props => []; 6 | } 7 | -------------------------------------------------------------------------------- /lib/presentation/model/search/presentation_server_side_search.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/presentation/model/search/presentation_server_side_state.dart'; 2 | import 'package:matrix/matrix.dart'; 3 | 4 | class PresentationServerSideSearch extends PresentationServerSideUIState { 5 | final List searchResults; 6 | 7 | PresentationServerSideSearch({ 8 | required this.searchResults, 9 | }); 10 | 11 | @override 12 | List get props => [searchResults]; 13 | } 14 | -------------------------------------------------------------------------------- /lib/presentation/model/search/presentation_server_side_state.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | abstract class PresentationServerSideUIState with EquatableMixin { 4 | @override 5 | List get props => []; 6 | } 7 | 8 | class PresentationServerSideInitial extends PresentationServerSideUIState {} 9 | -------------------------------------------------------------------------------- /lib/presentation/multiple_account/client_profile_presentation.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:matrix/matrix.dart'; 3 | 4 | class ClientProfilePresentation extends Equatable { 5 | final Profile profile; 6 | final Client client; 7 | 8 | const ClientProfilePresentation({ 9 | required this.profile, 10 | required this.client, 11 | }); 12 | 13 | @override 14 | List get props => [ 15 | profile, 16 | client, 17 | ]; 18 | } 19 | -------------------------------------------------------------------------------- /lib/presentation/state/failure.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/failure.dart'; 2 | 3 | abstract class FeatureFailure extends Failure { 4 | final dynamic exception; 5 | 6 | const FeatureFailure({this.exception}); 7 | 8 | @override 9 | List get props => [exception]; 10 | } 11 | -------------------------------------------------------------------------------- /lib/presentation/state/success.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/app_state/success.dart'; 2 | 3 | abstract class ViewState extends Success {} 4 | 5 | abstract class ViewEvent extends Success {} 6 | 7 | class UIState extends ViewState { 8 | static final idle = UIState(); 9 | 10 | UIState() : super(); 11 | 12 | @override 13 | List get props => []; 14 | } 15 | 16 | class LoadingState extends UIState {} 17 | -------------------------------------------------------------------------------- /lib/resource/assets_paths.dart: -------------------------------------------------------------------------------- 1 | class AssetsPaths { 2 | static const images = 'assets/images/'; 3 | static const configurationImages = 'configurations/icons/'; 4 | static const assets = 'assets/'; 5 | } 6 | -------------------------------------------------------------------------------- /lib/resource/colors.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | class AppColor { 4 | static const Color primary = Color(0xFF007AFF); 5 | static const Color secondaryPrimary = Color(0xFF0A84FF); 6 | static const Color colorDEEEFF = Color(0xFFDEEEFF); 7 | static const Color colorF2F3F5 = Color(0xFFF2F3F5); 8 | static const Color color2C2D2F = Color(0xFF2C2D2F); 9 | static const Color color818C99 = Color(0xFF818C99); 10 | static const Color colorE1E3E6 = Color(0xFFE1E3E6); 11 | } 12 | -------------------------------------------------------------------------------- /lib/utils/beautify_string_extension.dart: -------------------------------------------------------------------------------- 1 | extension BeautifyStringExtension on String { 2 | String get beautified { 3 | var beautifiedStr = ''; 4 | for (var i = 0; i < length; i++) { 5 | beautifiedStr += substring(i, i + 1); 6 | if (i % 4 == 3) { 7 | beautifiedStr += ' '; 8 | } 9 | if (i % 16 == 15) { 10 | beautifiedStr += '\n'; 11 | } 12 | } 13 | return beautifiedStr; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/utils/common_helper.dart: -------------------------------------------------------------------------------- 1 | T? tryCast(dynamic value, {T? fallback}) { 2 | if (value != null && value is T) { 3 | return value; 4 | } 5 | 6 | return fallback; 7 | } 8 | -------------------------------------------------------------------------------- /lib/utils/custom_scroll_behaviour.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/gestures.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | class CustomScrollBehavior extends MaterialScrollBehavior { 5 | @override 6 | Set get dragDevices => { 7 | PointerDeviceKind.touch, 8 | PointerDeviceKind.mouse, 9 | PointerDeviceKind.trackpad, 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /lib/utils/custom_svg_icons.dart: -------------------------------------------------------------------------------- 1 | class CustomSVGIcons { 2 | static String baseAssetUrl = 'assets/'; 3 | } 4 | -------------------------------------------------------------------------------- /lib/utils/exception/download_file_web_exception.dart: -------------------------------------------------------------------------------- 1 | class DownloadFileWebException implements Exception { 2 | final dynamic error; 3 | 4 | DownloadFileWebException({ 5 | this.error, 6 | }); 7 | 8 | @override 9 | String toString() => error; 10 | } 11 | -------------------------------------------------------------------------------- /lib/utils/exception/downloading_exception.dart: -------------------------------------------------------------------------------- 1 | class DownloadingException implements Exception { 2 | final dynamic error; 3 | 4 | DownloadingException({ 5 | this.error, 6 | }); 7 | 8 | @override 9 | String toString() => error; 10 | } 11 | 12 | class CancelDownloadingException extends DownloadingException { 13 | CancelDownloadingException() 14 | : super( 15 | error: 'User cancel downloading file', 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /lib/utils/exception/homeserver_exception.dart: -------------------------------------------------------------------------------- 1 | class CheckHomeserverTimeoutException implements Exception { 2 | final dynamic error; 3 | 4 | CheckHomeserverTimeoutException({ 5 | this.error, 6 | }); 7 | 8 | @override 9 | String toString() => error; 10 | } 11 | 12 | class HomeserverTokenNotFoundException implements Exception { 13 | final dynamic error; 14 | 15 | HomeserverTokenNotFoundException({ 16 | this.error, 17 | }); 18 | 19 | @override 20 | String toString() => error; 21 | } 22 | -------------------------------------------------------------------------------- /lib/utils/exception/leave_room_exception.dart: -------------------------------------------------------------------------------- 1 | class LeaveChatException implements Exception { 2 | final dynamic error; 3 | 4 | LeaveChatException({ 5 | this.error, 6 | }); 7 | 8 | @override 9 | String toString() => error; 10 | } 11 | 12 | class RoomNullException extends LeaveChatException { 13 | RoomNullException() 14 | : super( 15 | error: 16 | 'Leave room button clicked while room is null. This should not be possible from the UI!', 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /lib/utils/exception/save_to_downloads_exception.dart: -------------------------------------------------------------------------------- 1 | class SaveToDownloadsException implements Exception { 2 | final dynamic error; 3 | 4 | SaveToDownloadsException({ 5 | this.error, 6 | }); 7 | 8 | @override 9 | String toString() => error; 10 | } 11 | -------------------------------------------------------------------------------- /lib/utils/exception/save_to_gallery_exception.dart: -------------------------------------------------------------------------------- 1 | class SaveToGalleryException implements Exception { 2 | final dynamic error; 3 | 4 | SaveToGalleryException({ 5 | this.error, 6 | }); 7 | 8 | @override 9 | String toString() => error; 10 | } 11 | -------------------------------------------------------------------------------- /lib/utils/exception/storage_permission_exception.dart: -------------------------------------------------------------------------------- 1 | class StoragePermissionException implements Exception { 2 | final dynamic error; 3 | 4 | StoragePermissionException(this.error); 5 | } 6 | -------------------------------------------------------------------------------- /lib/utils/exception/upload_exception.dart: -------------------------------------------------------------------------------- 1 | class UploadException implements Exception { 2 | final dynamic error; 3 | 4 | UploadException({ 5 | this.error, 6 | }); 7 | 8 | @override 9 | String toString() => error; 10 | } 11 | 12 | class CancelUploadException extends UploadException { 13 | CancelUploadException() 14 | : super( 15 | error: 'User cancel upload file', 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /lib/utils/extension/basic_event_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:matrix/matrix.dart'; 2 | 3 | extension BacsicEventExtension on BasicEvent { 4 | Map formatContentForwards() { 5 | if (content['m.relates_to'] != null) { 6 | content.remove('m.relates_to'); 7 | } 8 | return content; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/utils/extension/event_info_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/domain/model/preview_file/supported_preview_file_types.dart'; 2 | import 'package:matrix/matrix.dart'; 3 | 4 | extension EventInfoExtension on Event { 5 | bool get isVideoAvailable => !isWmvVideo && !isAviVideo; 6 | 7 | bool get isWmvVideo => 8 | SupportedPreviewFileTypes.wmvMineType.contains(attachmentMimetype); 9 | 10 | bool get isAviVideo => 11 | SupportedPreviewFileTypes.aviMineType.contains(attachmentMimetype); 12 | } 13 | -------------------------------------------------------------------------------- /lib/utils/extension/event_status_custom_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:matrix/matrix.dart'; 2 | 3 | extension EventStatusCustomExtension on EventStatus { 4 | bool get isAvailable { 5 | return !isError && !isSending; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/utils/extension/navigator_state_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/widgets.dart'; 2 | 3 | extension NavigatorStateExtension on NavigatorState { 4 | void popAllDialogs() { 5 | popUntil((route) => route is! RawDialogRoute); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/utils/extension/string_extension.dart: -------------------------------------------------------------------------------- 1 | extension StringExtension on String { 2 | String capitalize() { 3 | return "${this[0].toUpperCase()}${substring(1).toLowerCase()}"; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /lib/utils/extension/value_notifier_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:matrix/matrix.dart'; 3 | 4 | extension ValueNotifierExtension on ValueNotifier { 5 | void toggle() { 6 | try { 7 | value = !value; 8 | } on FlutterError catch (e) { 9 | Logs().e('ValueNotifierExtension::toggle(): $e'); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/utils/extension/web_url_creation_extension.dart: -------------------------------------------------------------------------------- 1 | import 'dart:typed_data'; 2 | 3 | import 'package:universal_html/html.dart' as html; 4 | 5 | extension WebUrlCreationExtension on Uint8List { 6 | String toWebUrl({required String mimeType}) { 7 | final blob = html.Blob([this], mimeType); 8 | return html.Url.createObjectUrlFromBlob(blob); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/utils/js_window/non_js_window.dart: -------------------------------------------------------------------------------- 1 | import 'dart:typed_data'; 2 | 3 | import 'package:fluffychat/utils/js_window/universal_image_bitmap.dart'; 4 | 5 | Future convertUint8ListToBitmap(Uint8List buffer) async { 6 | return null; 7 | } 8 | -------------------------------------------------------------------------------- /lib/utils/js_window/universal_image_bitmap.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class UniversalImageBitmap extends Equatable { 4 | final int? height; 5 | final int? width; 6 | 7 | const UniversalImageBitmap({ 8 | this.height, 9 | this.width, 10 | }); 11 | 12 | @override 13 | List get props => [height, width]; 14 | } 15 | -------------------------------------------------------------------------------- /lib/utils/manager/download_manager/downloading_worker_queue.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/utils/task_queue/worker_queue.dart'; 2 | 3 | class DownloadWorkerQueue extends WorkerQueue { 4 | @override 5 | String get workerName => 'download_worker_queue'; 6 | } 7 | -------------------------------------------------------------------------------- /lib/utils/manager/upload_manager/models/upload_caption_info.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/utils/manager/upload_manager/models/upload_info.dart'; 2 | 3 | class UploadCaptionInfo extends UploadInfo { 4 | final String caption; 5 | 6 | UploadCaptionInfo({ 7 | required super.txid, 8 | required this.caption, 9 | }); 10 | 11 | @override 12 | List get props => [txid, caption]; 13 | } 14 | -------------------------------------------------------------------------------- /lib/utils/manager/upload_manager/models/upload_info.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | abstract class UploadInfo with EquatableMixin { 4 | final String txid; 5 | 6 | UploadInfo({ 7 | required this.txid, 8 | }); 9 | 10 | @override 11 | List get props => [txid]; 12 | } 13 | -------------------------------------------------------------------------------- /lib/utils/manager/upload_manager/upload_worker_queue.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/utils/task_queue/worker_queue.dart'; 2 | 3 | class UploadWorkerQueue extends WorkerQueue { 4 | @override 5 | String get workerName => 'upload_worker_queue'; 6 | } 7 | -------------------------------------------------------------------------------- /lib/utils/matrix_sdk_extensions/int_extension.dart: -------------------------------------------------------------------------------- 1 | extension IntExtension on int { 2 | String bytesToMB({int? placeDecimal}) { 3 | return (this / (1024 * 1024)).toStringAsFixed(placeDecimal ?? 0); 4 | } 5 | 6 | String bytesToKB({int? placeDecimal}) { 7 | return (this / 1024).toStringAsFixed(placeDecimal ?? 0); 8 | } 9 | 10 | int bytesToMBInt() { 11 | return this ~/ (1024 * 1024); 12 | } 13 | 14 | static const oneKB = 1024 * 1024; 15 | } 16 | -------------------------------------------------------------------------------- /lib/utils/one_time_debouncer.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:flutter/material.dart'; 4 | 5 | class OneTimeDebouncer { 6 | final int milliseconds; 7 | Timer? _timer; 8 | 9 | OneTimeDebouncer({required this.milliseconds}); 10 | 11 | void run(VoidCallback action) { 12 | if (_timer != null) { 13 | _timer!.cancel(); 14 | } 15 | 16 | _timer = Timer(Duration(milliseconds: milliseconds), action); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/utils/tor_stub.dart: -------------------------------------------------------------------------------- 1 | /// Stub class for [TorBrowserDetector] 2 | /// 3 | /// statically returns false as Tor **browser** can only be detected in a 4 | /// **browser**. 5 | abstract class TorBrowserDetector { 6 | static Future get isTorBrowser => Future.value(false); 7 | } 8 | -------------------------------------------------------------------------------- /lib/widgets/avatar/bottom_navigation_avatar_style.dart: -------------------------------------------------------------------------------- 1 | class BottomNavigationAvatarStyle { 2 | static const double avatarSize = 24.0; 3 | static const double avatarFontSize = 10.0; 4 | static const double selectedavatarBorderWidth = 2.0; 5 | } 6 | -------------------------------------------------------------------------------- /lib/widgets/context_menu/context_menu_action_item.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | abstract class ContextMenuItemAction with EquatableMixin { 4 | final T action; 5 | final ContextMenuItemState state; 6 | 7 | ContextMenuItemAction(this.action, this.state); 8 | 9 | @override 10 | List get props => [action, state]; 11 | 12 | bool get isActivated => state == ContextMenuItemState.activated; 13 | } 14 | 15 | enum ContextMenuItemState { activated, deactivated } 16 | -------------------------------------------------------------------------------- /lib/widgets/context_menu_builder_ios_paste_without_permission.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | Widget mobileTwakeContextMenuBuilder( 4 | BuildContext context, 5 | EditableTextState editableTextState, 6 | ) { 7 | if (SystemContextMenu.isSupported(context)) { 8 | return SystemContextMenu.editableText( 9 | editableTextState: editableTextState, 10 | ); 11 | } 12 | return AdaptiveTextSelectionToolbar.editableText( 13 | editableTextState: editableTextState, 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /lib/widgets/layouts/adaptive_layout/adaptive_scaffold_view_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AppScaffoldViewStyle { 4 | static const BorderRadiusGeometry borderRadiusBody = 5 | BorderRadius.all(Radius.circular(16.0)); 6 | 7 | static const double appBarSize = 80; 8 | } 9 | -------------------------------------------------------------------------------- /lib/widgets/layouts/agruments/app_adaptive_scaffold_body_args.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:matrix/matrix.dart'; 3 | 4 | abstract class AbsAppAdaptiveScaffoldBodyArgs with EquatableMixin { 5 | final Client? newActiveClient; 6 | 7 | const AbsAppAdaptiveScaffoldBodyArgs({ 8 | required this.newActiveClient, 9 | }); 10 | @override 11 | List get props => [ 12 | newActiveClient, 13 | ]; 14 | } 15 | -------------------------------------------------------------------------------- /lib/widgets/layouts/agruments/logged_in_body_args.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/widgets/layouts/agruments/app_adaptive_scaffold_body_args.dart'; 2 | 3 | class LoggedInBodyArgs extends AbsAppAdaptiveScaffoldBodyArgs { 4 | const LoggedInBodyArgs({ 5 | required super.newActiveClient, 6 | }); 7 | 8 | @override 9 | List get props => [ 10 | newActiveClient, 11 | ]; 12 | } 13 | -------------------------------------------------------------------------------- /lib/widgets/layouts/agruments/logged_in_other_account_body_args.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/widgets/layouts/agruments/app_adaptive_scaffold_body_args.dart'; 2 | 3 | class LoggedInOtherAccountBodyArgs extends AbsAppAdaptiveScaffoldBodyArgs { 4 | const LoggedInOtherAccountBodyArgs({ 5 | required super.newActiveClient, 6 | }); 7 | 8 | @override 9 | List get props => [ 10 | newActiveClient, 11 | ]; 12 | } 13 | -------------------------------------------------------------------------------- /lib/widgets/layouts/agruments/logout_body_args.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/widgets/layouts/agruments/app_adaptive_scaffold_body_args.dart'; 2 | 3 | class LogoutBodyArgs extends AbsAppAdaptiveScaffoldBodyArgs { 4 | const LogoutBodyArgs({ 5 | required super.newActiveClient, 6 | }); 7 | 8 | @override 9 | List get props => [ 10 | newActiveClient, 11 | ]; 12 | } 13 | -------------------------------------------------------------------------------- /lib/widgets/layouts/agruments/switch_active_account_body_args.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/widgets/layouts/agruments/app_adaptive_scaffold_body_args.dart'; 2 | 3 | class SwitchActiveAccountBodyArgs extends AbsAppAdaptiveScaffoldBodyArgs { 4 | const SwitchActiveAccountBodyArgs({ 5 | required super.newActiveClient, 6 | }); 7 | 8 | @override 9 | List get props => [ 10 | newActiveClient, 11 | ]; 12 | } 13 | -------------------------------------------------------------------------------- /lib/widgets/link_browser_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:url_launcher/link.dart'; 3 | 4 | class LinkBrowserWidget extends StatelessWidget { 5 | final Uri uri; 6 | final Widget child; 7 | 8 | const LinkBrowserWidget({super.key, required this.uri, required this.child}); 9 | 10 | @override 11 | Widget build(BuildContext context) { 12 | return Link(uri: uri, builder: (context, function) => child); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/widgets/mixins/show_dialog_mixin.dart: -------------------------------------------------------------------------------- 1 | import 'package:fluffychat/di/base_di.dart'; 2 | import 'package:flutter/material.dart'; 3 | 4 | mixin ShowDialogMixin { 5 | void showDialogWithDependency({ 6 | required BuildContext context, 7 | required BaseDI di, 8 | required RoutePageBuilder pageBuilder, 9 | OnFinishedBind? onFinishedBind, 10 | }) { 11 | di.bind(onFinishedBind: onFinishedBind); 12 | showGeneralDialog(context: context, pageBuilder: pageBuilder); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/widgets/phone_book_loading/phone_book_loading_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class PhoneBookLoadingStyle { 4 | static const EdgeInsets loadingPadding = EdgeInsets.all(16); 5 | } 6 | -------------------------------------------------------------------------------- /lib/widgets/search/empty_search_widget_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class EmptySearchWidgetStyle { 4 | static const double iconWidth = 136; 5 | 6 | static const double iconHeight = 120; 7 | 8 | static const EdgeInsetsGeometry textPadding = EdgeInsets.only(top: 8); 9 | 10 | static const EdgeInsetsGeometry bodyPadding = EdgeInsets.only(top: 48); 11 | } 12 | -------------------------------------------------------------------------------- /lib/widgets/set_active_client_state.dart: -------------------------------------------------------------------------------- 1 | enum SetActiveClientState { 2 | success, 3 | unknownClient; 4 | 5 | bool get isSuccess => this == SetActiveClientState.success; 6 | } 7 | -------------------------------------------------------------------------------- /lib/widgets/twake_components/twake_loading/center_loading_indicator.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class CenterLoadingIndicator extends StatelessWidget { 4 | const CenterLoadingIndicator({super.key}); 5 | 6 | @override 7 | Widget build(BuildContext context) { 8 | return const Padding( 9 | padding: EdgeInsets.all(16), 10 | child: Center(child: CircularProgressIndicator()), 11 | ); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/widgets/twake_components/twake_navigation_icon/twake_navigation_icon_style.dart: -------------------------------------------------------------------------------- 1 | class TwakeNavigationIconStyle { 2 | static double get badgeHeight => 16.0; 3 | } 4 | -------------------------------------------------------------------------------- /linux/.gitignore: -------------------------------------------------------------------------------- 1 | flutter/ephemeral 2 | -------------------------------------------------------------------------------- /linux/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void fl_register_plugins(FlPluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /linux/main.cc: -------------------------------------------------------------------------------- 1 | #include "my_application.h" 2 | 3 | int main(int argc, char** argv) { 4 | g_autoptr(MyApplication) app = my_application_new(); 5 | return g_application_run(G_APPLICATION(app), argc, argv); 6 | } 7 | -------------------------------------------------------------------------------- /linux/my_application.h: -------------------------------------------------------------------------------- 1 | #ifndef FLUTTER_MY_APPLICATION_H_ 2 | #define FLUTTER_MY_APPLICATION_H_ 3 | 4 | #include 5 | 6 | G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, 7 | GtkApplication) 8 | 9 | /** 10 | * my_application_new: 11 | * 12 | * Creates a new Flutter-based application. 13 | * 14 | * Returns: a new #MyApplication. 15 | */ 16 | MyApplication* my_application_new(); 17 | 18 | #endif // FLUTTER_MY_APPLICATION_H_ 19 | -------------------------------------------------------------------------------- /linux/packaging/appimage/make_config.yaml: -------------------------------------------------------------------------------- 1 | display_name: Twake 2 | 3 | icon: assets/logo.png 4 | 5 | keywords: 6 | - Chat 7 | - Messaging 8 | - Network 9 | - Social 10 | 11 | generic_name: Twake 12 | 13 | categories: 14 | - Network 15 | - Chat 16 | - InstantMessaging 17 | 18 | startup_notify: true 19 | 20 | include: 21 | - libolm.so.3 22 | -------------------------------------------------------------------------------- /macos/.gitignore: -------------------------------------------------------------------------------- 1 | # Flutter-related 2 | **/Flutter/ephemeral/ 3 | **/Pods/ 4 | 5 | # Xcode-related 6 | **/xcuserdata/ 7 | **/DerivedData/ -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | -------------------------------------------------------------------------------- /macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /macos/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | @NSApplicationMain 5 | class AppDelegate: FlutterAppDelegate { 6 | override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 | return true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /macos/Runner/MainFlutterWindow.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | class MainFlutterWindow: NSWindow { 5 | override func awakeFromNib() { 6 | let flutterViewController = FlutterViewController.init() 7 | let windowFrame = self.frame 8 | self.contentViewController = flutterViewController 9 | self.setFrame(windowFrame, display: true) 10 | 11 | RegisterGeneratedPlugins(registry: flutterViewController) 12 | 13 | super.awakeFromNib() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /macos/fastlane/Appfile: -------------------------------------------------------------------------------- 1 | app_identifier("app.twake.macos.chat") 2 | -------------------------------------------------------------------------------- /macos/packaging/dmg/make_config.yaml: -------------------------------------------------------------------------------- 1 | title: Twake 2 | contents: 3 | - x: 448 4 | y: 344 5 | type: link 6 | path: "/Applications" 7 | - x: 192 8 | y: 344 9 | type: file 10 | path: "Twake.app" 11 | code-sign: 12 | signing-identity: "@@IDENTITY@@" 13 | -------------------------------------------------------------------------------- /scripts/build-android-apk.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs 3 | flutter build apk --release 4 | mkdir -p build/android 5 | cp build/app/outputs/apk/release/app-release.apk build/android/ 6 | -------------------------------------------------------------------------------- /scripts/build-android-debug.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs 3 | flutter build apk --debug 4 | -------------------------------------------------------------------------------- /scripts/build-macos-debug.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ve 2 | flutter config --enable-macos-desktop 3 | flutter clean 4 | flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs 5 | cd macos 6 | bundle exec fastlane sync_dev 7 | pod install --repo-update 8 | pod update 9 | flutter build macos --profile -v 10 | -------------------------------------------------------------------------------- /scripts/build-macos.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ve 2 | flutter config --enable-macos-desktop 3 | flutter clean 4 | flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs 5 | cd macos 6 | bundle exec fastlane sync_dev_id 7 | pod install --repo-update 8 | pod update 9 | flutter build macos --release -v 10 | -------------------------------------------------------------------------------- /scripts/build-olm-windows.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | git clone https://gitlab.matrix.org/matrix-org/olm.git -b 3.2.12 4 | cd olm 5 | cmake . -Bbuild -DCMAKE_TOOLCHAIN_FILE=Windows64.cmake 6 | cmake --build build 7 | cd .. 8 | -------------------------------------------------------------------------------- /scripts/build-web.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ve 2 | TWAKECHAT_BASE_HREF=${TWAKECHAT_BASE_HREF:-/web/} 3 | flutter config --enable-web 4 | flutter clean 5 | flutter pub get 6 | flutter pub run build_runner build --delete-conflicting-outputs 7 | flutter build web --release --verbose --source-maps --base-href="$TWAKECHAT_BASE_HREF" 8 | cp config.sample.json ./build/web/config.json 9 | -------------------------------------------------------------------------------- /scripts/build-windows-debug.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Building for Windows." 3 | flutter config --enable-windows-desktop 4 | flutter clean 5 | flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs 6 | flutter build windows --profile -v 7 | 8 | # Building libolm 9 | echo "Building libolm." 10 | LIBOLM_VERSION=3.2.15 11 | git clone https://gitlab.matrix.org/matrix-org/olm.git -b "$LIBOLM_VERSION" 12 | (cd olm; cmake . -Bbuild; cmake --build build) 13 | -------------------------------------------------------------------------------- /scripts/build-windows.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Building for Windows." 3 | flutter config --enable-windows-desktop 4 | flutter clean 5 | flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs 6 | flutter build windows --release -v 7 | 8 | # Building libolm 9 | echo "Building libolm." 10 | LIBOLM_VERSION=3.2.15 11 | git clone https://gitlab.matrix.org/matrix-org/olm.git -b "$LIBOLM_VERSION" 12 | (cd olm; cmake . -Bbuild; cmake --build build) 13 | -------------------------------------------------------------------------------- /scripts/code_analyze.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ve 2 | flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs 3 | dart format --set-exit-if-changed lib/ test/ 4 | flutter analyze 5 | -------------------------------------------------------------------------------- /scripts/config-pre-commit.sh: -------------------------------------------------------------------------------- 1 | cd .git/hooks 2 | chmod +x pre-commit 3 | ln -s ../../scripts/pre-commit pre-commit -------------------------------------------------------------------------------- /scripts/copy-nse/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /element-x-ios-main 3 | /main.zip -------------------------------------------------------------------------------- /scripts/copy-nse/README.MD: -------------------------------------------------------------------------------- 1 | # Description 2 | - Script to copy all Notification Extension Service resource from Element X to Twake 3 | 4 | # Steps 5 | - Download Element X repository as zip and unzip 6 | - Copy source code from NSE 7 | - Apply patch: It is fix nullable slidingProxy when try decode from Keychain 8 | - Copy DesignKit: It is local dependencies required by NSE 9 | - Clean up: Delete zip file and unzip folder 10 | 11 | # Setup 12 | ``` 13 | cd scripts/copy-nse 14 | npm install 15 | node index.js 16 | ``` -------------------------------------------------------------------------------- /scripts/copy-nse/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "copy-nse", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "adm-zip": "^0.5.10", 13 | "curlrequest": "^1.0.1", 14 | "read-yaml-file": "^2.1.0", 15 | "request": "^2.88.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /scripts/integration-create-environment-variables.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | export USER1_NAME="alice" 4 | export USER1_PW="AliceInWonderland" 5 | export USER2_NAME="bob" 6 | export USER2_PW="JoWirSchaffenDas" 7 | -------------------------------------------------------------------------------- /scripts/integration-prepare-host.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | if ! command -v apk &>/dev/null; then 3 | apt update && apt install -y -qq docker.io ldnsutils grep scrcpy ffmpeg 4 | else 5 | apk update && apk add docker drill grep scrcpy ffmpeg 6 | fi 7 | -------------------------------------------------------------------------------- /scripts/integration-server-synapse.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | docker run -d --name synapse --tmpfs /data \ 3 | --volume="$(pwd)/integration_test/synapse/data/homeserver.yaml":/data/homeserver.yaml:rw \ 4 | --volume="$(pwd)/integration_test/synapse/data/localhost.log.config":/data/localhost.log.config:rw \ 5 | -p 80:80 matrixdotorg/synapse:latest 6 | -------------------------------------------------------------------------------- /scripts/integration-start-avd.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --install "system-images;android-31;default;x86_64" 3 | echo "no" | $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n test -k "system-images;android-31;default;x86_64" 4 | "$ANDROID_HOME"/platform-tools/adb start-server 5 | "$ANDROID_HOME"/emulator/emulator -avd test -wipe-data -no-audio -no-boot-anim -no-window -accel auto -gpu swiftshader_indirect 6 | -------------------------------------------------------------------------------- /scripts/package-windows-debug.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Setting up Inno Setup 3 | echo "Downloading and installing Inno Setup." 4 | curl -OL "https://files.jrsoftware.org/is/6/innosetup-6.2.2.exe" 5 | ./innosetup-6.2.2.exe //verysilent 6 | 7 | echo "Packaging." 8 | flutter pub get 9 | flutter pub global run flutter_distributor:main.dart package --platform windows --targets exe --skip-clean --flutter-build-args="profile" 10 | -------------------------------------------------------------------------------- /scripts/package-windows.ps1: -------------------------------------------------------------------------------- 1 | Write-Output "$WINDOWN_PFX" 2 | Move-Item -Path $WINDOWS_PFX -Destination fluffychat.pem 3 | certutil -decode fluffychat.pem fluffychat.pfx 4 | 5 | flutter pub run msix:create -c fluffychat.pfx -p $WINDOWS_PFX_PASS --sign-msix true --install-certificate false 6 | -------------------------------------------------------------------------------- /scripts/package-windows.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Setting up Inno Setup 3 | echo "Downloading and installing Inno Setup." 4 | curl -OL "https://files.jrsoftware.org/is/6/innosetup-6.2.2.exe" 5 | ./innosetup-6.2.2.exe //verysilent 6 | 7 | echo "Packaging." 8 | flutter pub get 9 | flutter pub global run flutter_distributor:main.dart package --platform windows --targets exe --skip-clean --flutter-build-args="release" 10 | -------------------------------------------------------------------------------- /scripts/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Run Dart analyze and check for errors 3 | if ! output=$(flutter analyze); then 4 | echo "COMMIT REJECTED: Flutter analyze found the following errors:" 5 | echo "$output" 6 | exit 1 7 | fi 8 | 9 | if ! output=$(dart format --set-exit-if-changed lib test); then 10 | echo "COMMIT REJECTED: Dart format found the following errors:" 11 | echo "$output" 12 | exit 1 13 | fi 14 | 15 | # If we made it this far, the commit is allowed 16 | exit 0 17 | -------------------------------------------------------------------------------- /scripts/prepare-android-release.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | echo "$ANDROID_KEYSTORE" | base64 --decode --ignore-garbage > android.jks 3 | echo "storePassword=${ANDROID_STORE_PASS}" >> key.properties 4 | echo "keyPassword=${ANDROID_KEY_PASS}" >> key.properties 5 | echo "keyAlias=${ANDROID_KEY_ALIAS}" >> key.properties 6 | echo "storeFile=../android.jks" >> key.properties 7 | echo "$PLAYSTORE_DEPLOY_KEY" >> keys.json 8 | bundle exec fastlane set_build_code_internal 9 | -------------------------------------------------------------------------------- /scripts/prepare-ios.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs 3 | cd ios 4 | pod install && pod update 5 | -------------------------------------------------------------------------------- /scripts/prepare-web-debug.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ve 2 | cd assets 3 | rm -r assets/js/package 4 | cd assets/js/ && curl -L 'https://gitlab.com/famedly/company/frontend/libraries/olm/-/jobs/artifacts/master/download?job=build:js' > olm.zip && cd ../../ 5 | cd assets/js/ && unzip olm.zip && cd ../../ 6 | cd assets/js/ && rm olm.zip && cd ../../ 7 | cd assets/js/ && mv javascript package && cd ../../ 8 | -------------------------------------------------------------------------------- /scripts/prepare-web.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ve 2 | rm -r assets/js/package 3 | cd assets/js/ && curl -L 'https://gitlab.com/famedly/company/frontend/libraries/olm/-/jobs/artifacts/master/download?job=build:js' > olm.zip && cd ../../ 4 | cd assets/js/ && unzip olm.zip && cd ../../ 5 | cd assets/js/ && rm olm.zip && cd ../../ 6 | cd assets/js/ && mv javascript package && cd ../../ 7 | -------------------------------------------------------------------------------- /scripts/prepare-windows.ps1: -------------------------------------------------------------------------------- 1 | choco install flutter cmake --installargs 'ADD_CMAKE_TO_PATH=System' -y 2 | Import-Module "$env:ChocolateyInstall\helpers\chocolateyProfile.psm1" 3 | refreshenv 4 | 5 | flutter config --no-analytics 6 | -------------------------------------------------------------------------------- /scripts/release-android-apk.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | set -eux 4 | 5 | flutter build apk --release 6 | version=$(git describe --tags --exact-match) 7 | cp build/app/outputs/apk/release/app-release.apk twake-"$version"-android.apk 8 | -------------------------------------------------------------------------------- /scripts/release-ios-testflight.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ve 2 | bundle exec fastlane beta 3 | -------------------------------------------------------------------------------- /scripts/release-playstore-beta.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs 3 | flutter build appbundle --release 4 | cd android 5 | bundle exec fastlane deploy_internal_test 6 | -------------------------------------------------------------------------------- /scripts/release-playstore.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ve 2 | RELEASE_TYPE=$(echo $CI_COMMIT_TAG | grep -oE "[a-z]+") 3 | cd android 4 | if [ "$RELEASE_TYPE" = "rc" ]; then 5 | bundle exec fastlane deploy_candidate 6 | else 7 | bundle exec fastlane deploy_release 8 | fi 9 | cd .. 10 | -------------------------------------------------------------------------------- /scripts/update-dependencies.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ve 2 | flutter pub upgrade --major-versions 3 | flutter pub get 4 | dart fix --apply 5 | dart format lib test 6 | flutter pub run import_sorter:main --no-comments -------------------------------------------------------------------------------- /test/archive_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | 3 | void main() { 4 | testWidgets('Test if the widget can be created', (WidgetTester tester) async { 5 | /*await tester.pumpWidget(FluffyChatApp( 6 | testWidget: Archive(), 7 | testClient: await testClient(loggedIn: true), 8 | ));*/ 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /test_driver/integration_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:integration_test/integration_test_driver.dart'; 2 | 3 | Future main() => integrationDriver(); 4 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/splash/img/branding-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/branding-1x.png -------------------------------------------------------------------------------- /web/splash/img/branding-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/branding-2x.png -------------------------------------------------------------------------------- /web/splash/img/branding-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/branding-3x.png -------------------------------------------------------------------------------- /web/splash/img/branding-4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/branding-4x.png -------------------------------------------------------------------------------- /web/splash/img/branding-dark-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/branding-dark-1x.png -------------------------------------------------------------------------------- /web/splash/img/branding-dark-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/branding-dark-2x.png -------------------------------------------------------------------------------- /web/splash/img/branding-dark-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/branding-dark-3x.png -------------------------------------------------------------------------------- /web/splash/img/branding-dark-4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/branding-dark-4x.png -------------------------------------------------------------------------------- /web/splash/img/dark-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/dark-1x.png -------------------------------------------------------------------------------- /web/splash/img/dark-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/dark-2x.png -------------------------------------------------------------------------------- /web/splash/img/dark-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/dark-3x.png -------------------------------------------------------------------------------- /web/splash/img/dark-4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/dark-4x.png -------------------------------------------------------------------------------- /web/splash/img/light-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/light-1x.png -------------------------------------------------------------------------------- /web/splash/img/light-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/light-2x.png -------------------------------------------------------------------------------- /web/splash/img/light-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/light-3x.png -------------------------------------------------------------------------------- /web/splash/img/light-4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/web/splash/img/light-4x.png -------------------------------------------------------------------------------- /web/splash/splash.js: -------------------------------------------------------------------------------- 1 | function removeSplashFromWeb() { 2 | document.getElementById("splash")?.remove(); 3 | document.getElementById("splash-branding")?.remove(); 4 | document.body.style.background = "transparent"; 5 | } 6 | -------------------------------------------------------------------------------- /windows/.gitignore: -------------------------------------------------------------------------------- 1 | flutter/ephemeral/ 2 | 3 | # Visual Studio user-specific files. 4 | *.suo 5 | *.user 6 | *.userosscache 7 | *.sln.docstates 8 | 9 | # Visual Studio build-related files. 10 | x64/ 11 | x86/ 12 | 13 | # Visual Studio cache files 14 | # files ending in .cache can be ignored 15 | *.[Cc]ache 16 | # but keep track of directories ending in .cache 17 | !*.[Cc]ache/ 18 | -------------------------------------------------------------------------------- /windows/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void RegisterPlugins(flutter::PluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /windows/packaging/exe/make_config.yaml: -------------------------------------------------------------------------------- 1 | # The value of AppId uniquely identifies this application. 2 | # Do not use the same AppId value in installers for other applications. 3 | app_id: 9A8EB9D7-8230-4DB5-B149-18ADD8304B73 4 | publisher_name: Linagora 5 | publisher_url: https://github.com/linagora/twake-on-matrix 6 | display_name: Twake 7 | create_desktop_icon: true 8 | install_dir_name: "{autopf}/Twake" 9 | script_template: inno_setup.iss 10 | locales: 11 | - en 12 | -------------------------------------------------------------------------------- /windows/runner/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by Runner.rc 4 | // 5 | #define IDI_APP_ICON 101 6 | 7 | // Next default values for new objects 8 | // 9 | #ifdef APSTUDIO_INVOKED 10 | #ifndef APSTUDIO_READONLY_SYMBOLS 11 | #define _APS_NEXT_RESOURCE_VALUE 102 12 | #define _APS_NEXT_COMMAND_VALUE 40001 13 | #define _APS_NEXT_CONTROL_VALUE 1001 14 | #define _APS_NEXT_SYMED_VALUE 101 15 | #endif 16 | #endif 17 | -------------------------------------------------------------------------------- /windows/runner/resources/app_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/windows/runner/resources/app_icon.ico -------------------------------------------------------------------------------- /winuwp/.gitignore: -------------------------------------------------------------------------------- 1 | flutter/ephemeral/ 2 | 3 | # Visual Studio user-specific files. 4 | *.suo 5 | *.user 6 | *.userosscache 7 | *.sln.docstates 8 | 9 | # Visual Studio build-related files. 10 | x64/ 11 | x86/ 12 | 13 | # Visual Studio cache files 14 | # files ending in .cache can be ignored 15 | *.[Cc]ache 16 | # but keep track of directories ending in .cache 17 | !*.[Cc]ache/ 18 | -------------------------------------------------------------------------------- /winuwp/flutter/generated_plugin_registrant.cc: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #include "generated_plugin_registrant.h" 8 | 9 | 10 | void RegisterPlugins(flutter::PluginRegistry* registry) { 11 | } 12 | -------------------------------------------------------------------------------- /winuwp/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void RegisterPlugins(flutter::PluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /winuwp/project_version: -------------------------------------------------------------------------------- 1 | 0 -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/LargeTile.scale-100.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/LargeTile.scale-125.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/LargeTile.scale-150.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/LargeTile.scale-200.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/LargeTile.scale-400.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/LockScreenLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/LockScreenLogo.scale-200.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/SmallTile.scale-100.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/SmallTile.scale-125.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/SmallTile.scale-150.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/SmallTile.scale-200.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/SmallTile.scale-400.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-24_altform-unplated.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/StoreLogo.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/WideTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/WideTile.scale-100.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/WideTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/WideTile.scale-125.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/WideTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/WideTile.scale-150.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/WideTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/WideTile.scale-200.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Assets/WideTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Assets/WideTile.scale-400.png -------------------------------------------------------------------------------- /winuwp/runner_uwp/Windows_TemporaryKey.pfx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/Windows_TemporaryKey.pfx -------------------------------------------------------------------------------- /winuwp/runner_uwp/resources.pri: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/linagora/twake-on-matrix/9772bc7d9597eee9a85f58cb5cc834de33f46fc1/winuwp/runner_uwp/resources.pri --------------------------------------------------------------------------------