diff --git a/.github/workflows/gh-pages.yaml b/.github/workflows/gh-pages.yaml
index 4dc57f5ee2..c49ade49c7 100644
--- a/.github/workflows/gh-pages.yaml
+++ b/.github/workflows/gh-pages.yaml
@@ -11,6 +11,8 @@ jobs:
deploy_preview:
name: Deploy preview versions on pull requests
runs-on: ubuntu-latest
+ concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
permissions:
deployments: write
pull-requests: write
diff --git a/.github/workflows/image.yaml b/.github/workflows/image.yaml
index 46fef09072..d9764b4511 100644
--- a/.github/workflows/image.yaml
+++ b/.github/workflows/image.yaml
@@ -20,6 +20,9 @@ jobs:
environment: dev
steps:
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
@@ -54,6 +57,7 @@ jobs:
uses: docker/build-push-action@v4
with:
push: true
+ platforms: "linux/amd64,linux/arm64"
cache-from: |
type=gha
cache-to: |
@@ -70,6 +74,9 @@ jobs:
environment: prod
steps:
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
@@ -105,6 +112,7 @@ jobs:
uses: docker/build-push-action@v4
with:
push: true
+ platforms: "linux/amd64,linux/arm64"
cache-from: |
type=gha
cache-to: |
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index ddd5d18125..4c9a2d845e 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -149,7 +149,7 @@ jobs:
run: |
case "$RUNNER_OS" in
Linux)
- cp dist/*/* "twake-$GITHUB_REF_NAME-linux-amd64.AppImage";;
+ cp dist/* "twake-$GITHUB_REF_NAME-linux-amd64.AppImage";;
macOS)
cp dist/*/* "twake-$GITHUB_REF_NAME-macos-amd64.dmg"
# Notarize the app
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ae17ee6581..82e4eb0706 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1706,6 +1706,22 @@ Version 0.30.0 will be the first version with arm64 support. You can download bi
This CHANGELOG.md was generated with [**Changelog for
Dart**](https://pub.dartlang.org/packages/changelog)
+## [2.3.3+2330] - 2023-10-18
+
+### Added
+
+- enable emoji in web
+- styling for Chat List
+- new selection in chat list
+- copy/paste in Chat
+- update avatar in responsive screen
+- Shift+Enter
+
+### Fixed
+
+- keyboard handling when scrolling chat
+- click on notification redirect to exact message
+
## [2.3.2+2330] - 2023-10-06
### Added
@@ -1722,9 +1738,7 @@ Dart**](https://pub.dartlang.org/packages/changelog)
- gesture to back
## [2.3.1+2330] - 2023-09-29
-
### Fixed
-
- loading in search inside app
- chat list selection
- video player
@@ -1770,8 +1784,9 @@ Dart**](https://pub.dartlang.org/packages/changelog)
- Reduce unnecessary API request to Profile API
- Fix the placeholder for image to reduce memory consumption
-[2.3.2+2330]: https://github.com/linagora/twake-on-matrix/releases/tag/2.3.2
+[2.3.3+2330]: https://github.com/linagora/twake-on-matrix/releases/tag/2.3.3
+[2.3.2+2330]: https://github.com/linagora/twake-on-matrix/releases/tag/2.3.2
[2.3.1+2330]: https://github.com/linagora/twake-on-matrix/releases/tag/2.3.1
[2.3.0+2330]: https://github.com/linagora/twake-on-matrix/releases/tag/2.3.0
[2.2.4+2330]: https://github.com/linagora/twake-on-matrix/releases/tag/2.2.4
diff --git a/Dockerfile b/Dockerfile
index 01d3052ec6..bdda6a545f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,16 +3,17 @@ ARG FLUTTER_VERSION=3.10.6
ARG OLM_VERSION=3.2.15
# Building libolm
-FROM nixos/nix AS olm-builder
+# libolm only has amd64
+FROM --platform=linux/amd64 nixos/nix AS olm-builder
ARG OLM_VERSION
RUN nix build -v --extra-experimental-features flakes --extra-experimental-features nix-command gitlab:matrix-org/olm/${OLM_VERSION}?host=gitlab.matrix.org\#javascript
-# Building Twake web files
-FROM ghcr.io/cirruslabs/flutter:${FLUTTER_VERSION} as web-builder
+# Building Twake for the web
+FROM --platform=linux/amd64 ghcr.io/cirruslabs/flutter:${FLUTTER_VERSION} AS web-builder
COPY . /app
WORKDIR /app
-RUN apt update && \
- apt install openssh-client -y && \
+RUN DEBIAN_FRONTEND=noninteractive apt update && \
+ apt install -y openssh-client && \
rm -rf assets/js/* && \
mkdir ~/.ssh && \
ssh-keyscan github.com >> ~/.ssh/known_hosts
@@ -20,7 +21,7 @@ COPY --from=olm-builder /result/javascript assets/js/package
RUN --mount=type=ssh,required=true ./scripts/build-web.sh
# Final image
-FROM nginx:alpine
+FROM nginx:alpine AS final-image
RUN rm -rf /usr/share/nginx/html
COPY --from=web-builder /app/build/web /usr/share/nginx/html/web/
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 23419542c7..a985cab9c1 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -33,6 +33,7 @@ if (keystorePropertiesFile.exists()) {
android {
compileSdkVersion 33
+ ndkVersion flutter.ndkVersion
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
@@ -44,7 +45,7 @@ android {
defaultConfig {
applicationId "com.twake.twake"
- minSdkVersion 21
+ minSdkVersion 23
targetSdkVersion 33
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 78d5c7eb27..700a8dbbcd 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -40,7 +40,7 @@
android:requestLegacyExternalStorage="true"
android:allowBackup="false"
android:fullBackupContent="false"
- >
+ >
+
+
diff --git a/appimage/AppImageBuilder.yml b/appimage/AppImageBuilder.yml
new file mode 100644
index 0000000000..428219d48d
--- /dev/null
+++ b/appimage/AppImageBuilder.yml
@@ -0,0 +1,65 @@
+# appimage-builder recipe see https://appimage-builder.readthedocs.io for details
+script:
+ - rm -rf AppDir | true
+ - cp -r ./build/linux/x64/{{BUILD_TYPE}}/bundle AppDir
+ - mkdir -p AppDir/usr/share/icons/hicolor/64x64/apps/
+ - cp ./assets/logo.svg AppDir/usr/share/icons/hicolor/64x64/apps/twake.svg
+version: 1
+AppDir:
+ path: ./AppDir
+ app_info:
+ id: com.linagora.linux.twake
+ name: Twake
+ icon: twake
+ version: latest
+ exec: fluffychat
+ exec_args: $@
+ apt:
+ arch:
+ - amd64
+ allow_unauthenticated: true
+ sources:
+ - sourceline: deb http://azure.archive.ubuntu.com/ubuntu/ {{VERSION_CODENAME}} main restricted universe multiverse
+ key_url: "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920D1991BC93C"
+ - sourceline: deb http://azure.archive.ubuntu.com/ubuntu/ {{VERSION_CODENAME}}-updates main restricted universe multiverse
+ key_url: "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920D1991BC93C"
+ - sourceline: deb http://azure.archive.ubuntu.com/ubuntu/ {{VERSION_CODENAME}}-backports main restricted universe multiverse
+ key_url: "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920D1991BC93C"
+ - sourceline: deb http://azure.archive.ubuntu.com/ubuntu {{VERSION_CODENAME}}-security main restricted universe multiverse
+ key_url: "http://keyserver.ubuntu.com/pks/lookup?op=get&search=0x871920D1991BC93C"
+ include:
+ - libgtk-3-0
+ - libwayland-cursor0
+ - libc6
+ - libjsoncpp25
+ - libsecret-1-0
+ - libmpv1
+ - libdrm2
+ - libolm3
+ files:
+ include: []
+ exclude:
+ - usr/share/man
+ - usr/share/doc/*/README.*
+ - usr/share/doc/*/changelog.*
+ - usr/share/doc/*/NEWS.*
+ - usr/share/doc/*/TODO.*
+ test:
+ fedora-30:
+ image: appimagecrafters/tests-env:fedora-30
+ command: ./AppRun
+ debian-stable:
+ image: appimagecrafters/tests-env:debian-stable
+ command: ./AppRun
+ archlinux-latest:
+ image: appimagecrafters/tests-env:archlinux-latest
+ command: ./AppRun
+ centos-7:
+ image: appimagecrafters/tests-env:centos-7
+ command: ./AppRun
+ ubuntu-bionic:
+ image: appimagecrafters/tests-env:ubuntu-bionic
+ command: ./AppRun
+AppImage:
+ arch: x86_64
+ update-information: guess
diff --git a/assets/l10n/intl_ar.arb b/assets/l10n/intl_ar.arb
index 2033b5ff81..2498342cd9 100644
--- a/assets/l10n/intl_ar.arb
+++ b/assets/l10n/intl_ar.arb
@@ -417,11 +417,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "نزِّل الملف",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"editDisplayname": "حرر الاسم العلني",
"@editDisplayname": {
"type": "text",
@@ -776,11 +771,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "رسالة جديدة في فلافي-شات",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "طلب تحقق جديد!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_ca.arb b/assets/l10n/intl_ca.arb
index f0ddf09e39..c4d35ddfc4 100644
--- a/assets/l10n/intl_ca.arb
+++ b/assets/l10n/intl_ca.arb
@@ -490,11 +490,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Baixa el fitxer",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Edita",
"@edit": {
"type": "text",
@@ -921,11 +916,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Missatge nou al FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Nova sol·licitud de verificació!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_cs.arb b/assets/l10n/intl_cs.arb
index f1fcc738cf..6adfce8b6a 100644
--- a/assets/l10n/intl_cs.arb
+++ b/assets/l10n/intl_cs.arb
@@ -644,11 +644,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Stáhnout soubor",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Upravit",
"@edit": {
"type": "text",
@@ -1159,11 +1154,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Nová zpráva ve FluffyChatu",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Nová žádost o ověření!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_de.arb b/assets/l10n/intl_de.arb
index a8606ad10f..88f57c2e35 100644
--- a/assets/l10n/intl_de.arb
+++ b/assets/l10n/intl_de.arb
@@ -639,11 +639,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Datei herunterladen",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Bearbeiten",
"@edit": {
"type": "text",
@@ -1154,11 +1149,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Neue Nachricht in FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Neue Verifikationsanfrage!",
"@newVerificationRequest": {
"type": "text",
@@ -2539,5 +2529,12 @@
"enterInviteLinkOrMatrixId": "Einladungslink oder Matrix-ID eingeben …",
"@enterInviteLinkOrMatrixId": {},
"reopenChat": "Chat wieder eröffnen",
- "@reopenChat": {}
+ "@reopenChat": {},
+ "enterGroupName": "Chatname eingeben",
+ "@enterGroupName": {
+ "type": "text",
+ "placeholders": {}
+ },
+ "invite": "Einladen",
+ "@invite": {}
}
diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb
index 424e327543..b9d2cfea19 100644
--- a/assets/l10n/intl_en.arb
+++ b/assets/l10n/intl_en.arb
@@ -733,8 +733,8 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Download file",
- "@downloadFile": {
+ "download": "Download",
+ "@download": {
"type": "text",
"placeholders": {}
},
@@ -1262,8 +1262,8 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 New message in FluffyChat",
- "@newMessageInFluffyChat": {
+ "newMessageInTwake": "You have 1 encrypted message",
+ "@newMessageInTwake": {
"type": "text",
"placeholders": {}
},
@@ -2532,36 +2532,16 @@
"noOtherDevicesFound": "No other devices found",
"fileIsTooBigForServer": "The server reports that the file is too large to be sent.",
"onlineStatus": "online",
- "onlineLongTimeAgo": "online long time ago",
- "onlineMinAgo": "online {min} min ago",
+ "onlineMinAgo": "online {min}m ago",
"@onlineMinAgo": {
"placeholders": {
"min": {}
}
},
- "onlineHourAgo": "online {hour} h {min} min ago",
+ "onlineHourAgo": "online {hour}h ago",
"@onlineHourAgo": {
"placeholders": {
- "hour": {},
- "min": {}
- }
- },
- "onlineDayAgo": "online {day} day ago",
- "@onlineDayAgo": {
- "placeholders": {
- "day": {}
- }
- },
- "onlineWeekAgo": "online {week} week ago",
- "@onlineWeekAgo": {
- "placeholders": {
- "week": {}
- }
- },
- "onlineMonthAgo": "online {month} month ago",
- "@onlineMonthAgo": {
- "placeholders": {
- "month": {}
+ "hour": {}
}
},
"noMessageHereYet": "No message here yet...",
@@ -2755,8 +2735,16 @@
"editWorkIdentitiesDescriptions": "Edit your work identity settings such as Matrix ID, email or company name.",
"copiedMatrixIdToClipboard": "Copied Matrix ID to clipboard.",
"changeProfilePhoto": "Change profile photo",
+ "countPinChat": "PINNED CHATS ({countPinChat})",
+ "countAllChat": "ALL CHATS ({countAllChat})",
"thisMessageHasBeenEncrypted": "This message has been encrypted",
"roomCreationFailed": "Room creation failed",
"errorGettingPdf": "Error getting PDF",
- "errorPreviewingFile": "Error previewing file"
+ "errorPreviewingFile": "Error previewing file",
+ "paste": "Paste",
+ "cut": "Cut",
+ "pasteImageFailed": "Paste image failed",
+ "copyImageFailed": "Copy image failed",
+ "fileFormatNotSupported": "File format not supported",
+ "copyImageSuccess": "Image copied to clipboard"
}
\ No newline at end of file
diff --git a/assets/l10n/intl_eo.arb b/assets/l10n/intl_eo.arb
index 2a9e0f495b..4e4c904412 100644
--- a/assets/l10n/intl_eo.arb
+++ b/assets/l10n/intl_eo.arb
@@ -633,11 +633,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Elŝuti dosieron",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Redakti",
"@edit": {
"type": "text",
@@ -1138,11 +1133,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Nova mesaĝo en FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Nova kontrolpeto!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_es.arb b/assets/l10n/intl_es.arb
index 3f9acb0e8e..d4fc035bc6 100644
--- a/assets/l10n/intl_es.arb
+++ b/assets/l10n/intl_es.arb
@@ -480,11 +480,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Descargar archivo",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"editDisplayname": "Editar nombre visible",
"@editDisplayname": {
"type": "text",
@@ -879,11 +874,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Nuevo mensaje en FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "¡Nueva solicitud de verificación!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_et.arb b/assets/l10n/intl_et.arb
index 223b4d8bf3..a17b40ae9a 100644
--- a/assets/l10n/intl_et.arb
+++ b/assets/l10n/intl_et.arb
@@ -644,11 +644,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Laadi fail alla",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Muuda",
"@edit": {
"type": "text",
@@ -1159,11 +1154,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Uus sõnum FluffyChat'i vahendusel",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Uus verifitseerimispäring!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_eu.arb b/assets/l10n/intl_eu.arb
index a2fe8eceff..f6762af4a6 100644
--- a/assets/l10n/intl_eu.arb
+++ b/assets/l10n/intl_eu.arb
@@ -407,11 +407,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Deskargatu fitxategia",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"editDisplayname": "Editatu ezizena",
"@editDisplayname": {
"type": "text",
@@ -751,11 +746,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Mezu berria FluffyChaten",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Egiaztaketa eskaera berria!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_fa.arb b/assets/l10n/intl_fa.arb
index 9e5e5161d0..60c7d6df70 100644
--- a/assets/l10n/intl_fa.arb
+++ b/assets/l10n/intl_fa.arb
@@ -780,11 +780,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "پرونده را بارگیرید",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "ویرایش",
"@edit": {
"type": "text",
diff --git a/assets/l10n/intl_fi.arb b/assets/l10n/intl_fi.arb
index 52488a1269..c00fc1c1a5 100644
--- a/assets/l10n/intl_fi.arb
+++ b/assets/l10n/intl_fi.arb
@@ -507,11 +507,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Lataa tiedosto",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Muokkaa",
"@edit": {
"type": "text",
@@ -923,11 +918,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Uusi viesti FluffyChätissä",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Uusi varmennuspyyntö!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_fr.arb b/assets/l10n/intl_fr.arb
index 53cfed1391..0372a0155f 100644
--- a/assets/l10n/intl_fr.arb
+++ b/assets/l10n/intl_fr.arb
@@ -648,8 +648,8 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Télécharger le fichier",
- "@downloadFile": {
+ "download": "Télécharger",
+ "@download": {
"type": "text",
"placeholders": {}
},
@@ -1163,8 +1163,8 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Nouveau message dans FluffyChat",
- "@newMessageInFluffyChat": {
+ "newMessageInTwake": "Vous avez un message chiffré",
+ "@newMessageInTwake": {
"type": "text",
"placeholders": {}
},
diff --git a/assets/l10n/intl_ga.arb b/assets/l10n/intl_ga.arb
index d60456ae96..cae5d9ce43 100644
--- a/assets/l10n/intl_ga.arb
+++ b/assets/l10n/intl_ga.arb
@@ -1260,11 +1260,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Íoslódáil comhad",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"changePassword": "Athraigh an pasfhocal",
"@changePassword": {
"type": "text",
@@ -1357,11 +1352,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Teachtaireacht nua i FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"needPantalaimonWarning": "Bí ar an eolas go dteastaíonn Pantalaimon uait chun criptiú ó cheann go ceann a úsáid anois.",
"@needPantalaimonWarning": {
"type": "text",
diff --git a/assets/l10n/intl_gl.arb b/assets/l10n/intl_gl.arb
index 77b2487697..27ff17451d 100644
--- a/assets/l10n/intl_gl.arb
+++ b/assets/l10n/intl_gl.arb
@@ -644,11 +644,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Descargar ficheiro",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Editar",
"@edit": {
"type": "text",
@@ -1159,11 +1154,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Nova mensaxe en FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Nova solicitude de verificación!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_he.arb b/assets/l10n/intl_he.arb
index c69bbf432e..8df139979d 100644
--- a/assets/l10n/intl_he.arb
+++ b/assets/l10n/intl_he.arb
@@ -548,11 +548,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "הורד קובץ",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "ערוך",
"@edit": {
"type": "text",
@@ -1307,11 +1302,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "הודעה חדשה ב-FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"monday": "יום שני",
"@monday": {
"type": "text",
diff --git a/assets/l10n/intl_hr.arb b/assets/l10n/intl_hr.arb
index f60d634449..a3f4428766 100644
--- a/assets/l10n/intl_hr.arb
+++ b/assets/l10n/intl_hr.arb
@@ -634,11 +634,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Preuzmi datoteku",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Uredi",
"@edit": {
"type": "text",
@@ -1132,11 +1127,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Nova poruka u FluffyChatu",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Novi zahtjev za potvrđivanje!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_hu.arb b/assets/l10n/intl_hu.arb
index 814bb9ed10..b49f56e83d 100644
--- a/assets/l10n/intl_hu.arb
+++ b/assets/l10n/intl_hu.arb
@@ -427,11 +427,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Fájl letöltése",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"editDisplayname": "Megjelenítési név módosítása",
"@editDisplayname": {
"type": "text",
@@ -811,11 +806,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Új FluffyChat-üzenet",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Új hitelesítési kérelem!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_id.arb b/assets/l10n/intl_id.arb
index dd263d5047..2314882682 100644
--- a/assets/l10n/intl_id.arb
+++ b/assets/l10n/intl_id.arb
@@ -364,11 +364,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Unduh berkas",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"displaynameHasBeenChanged": "Nama tampilan telah diubah",
"@displaynameHasBeenChanged": {
"type": "text",
@@ -947,11 +942,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Pesan baru di FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newChat": "Chat baru",
"@newChat": {
"type": "text",
diff --git a/assets/l10n/intl_ie.arb b/assets/l10n/intl_ie.arb
index d464aa5b28..9974cb8a2d 100644
--- a/assets/l10n/intl_ie.arb
+++ b/assets/l10n/intl_ie.arb
@@ -725,11 +725,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Descargar li file",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"emoteSettings": "Parametres de emotiones",
"@emoteSettings": {
"type": "text",
diff --git a/assets/l10n/intl_it.arb b/assets/l10n/intl_it.arb
index c2293a5bfe..b4455e79b2 100644
--- a/assets/l10n/intl_it.arb
+++ b/assets/l10n/intl_it.arb
@@ -532,11 +532,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Scarica il file",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Modifica",
"@edit": {
"type": "text",
@@ -1016,11 +1011,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Nuovo messaggio in FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Nuova richiesta di verifica!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_ja.arb b/assets/l10n/intl_ja.arb
index 0b3b0cf9dd..aec05e2c21 100644
--- a/assets/l10n/intl_ja.arb
+++ b/assets/l10n/intl_ja.arb
@@ -535,11 +535,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "ファイルのダウンロード",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "編集",
"@edit": {
"type": "text",
@@ -1024,11 +1019,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 FluffyChatに新しいメッセージがあります",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "認証リクエスト!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_ko.arb b/assets/l10n/intl_ko.arb
index 6bbd878d93..26172ace2f 100644
--- a/assets/l10n/intl_ko.arb
+++ b/assets/l10n/intl_ko.arb
@@ -290,11 +290,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "파일 다운로드",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"displaynameHasBeenChanged": "표시 이름이 변경되었습니다",
"@displaynameHasBeenChanged": {
"type": "text",
@@ -1271,11 +1266,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "FluffyChat에서 새로운 메시지",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newChat": "새로운 채팅",
"@newChat": {
"type": "text",
diff --git a/assets/l10n/intl_lt.arb b/assets/l10n/intl_lt.arb
index 0eef272fac..798e45537c 100644
--- a/assets/l10n/intl_lt.arb
+++ b/assets/l10n/intl_lt.arb
@@ -21,11 +21,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Atsisiųsti failą",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"friday": "Penktadienis",
"@friday": {
"type": "text",
@@ -990,11 +985,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Nauja žinutė FluffyChat'e",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Nauja patvirtinimo užklausa!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_nb.arb b/assets/l10n/intl_nb.arb
index 90ac0eeb63..d4294d66ce 100644
--- a/assets/l10n/intl_nb.arb
+++ b/assets/l10n/intl_nb.arb
@@ -501,11 +501,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Last ned fil",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Rediger",
"@edit": {
"type": "text",
@@ -980,11 +975,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Ny melding i FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Ny bekreftelsesforespørsel!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_nl.arb b/assets/l10n/intl_nl.arb
index 06ae02e8b5..b5ed2e3e5e 100644
--- a/assets/l10n/intl_nl.arb
+++ b/assets/l10n/intl_nl.arb
@@ -647,11 +647,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Bestand downloaden",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Wijzig",
"@edit": {
"type": "text",
@@ -1162,11 +1157,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Nieuw bericht in FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Nieuw verificatieverzoek!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_pl.arb b/assets/l10n/intl_pl.arb
index 02ed99530b..bf0b124243 100644
--- a/assets/l10n/intl_pl.arb
+++ b/assets/l10n/intl_pl.arb
@@ -582,11 +582,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Pobierz plik",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Edytuj",
"@edit": {
"type": "text",
@@ -1016,11 +1011,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Nowa wiadomość w FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Nowa prośba o weryfikację!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_pt_BR.arb b/assets/l10n/intl_pt_BR.arb
index 2231709a40..9e5e948f34 100644
--- a/assets/l10n/intl_pt_BR.arb
+++ b/assets/l10n/intl_pt_BR.arb
@@ -643,11 +643,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Baixar arquivo",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Editar",
"@edit": {
"type": "text",
@@ -1158,11 +1153,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Nova mensagem no FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Nova solicitação de verificação!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_pt_PT.arb b/assets/l10n/intl_pt_PT.arb
index cf8d807aaf..64ae5713d9 100644
--- a/assets/l10n/intl_pt_PT.arb
+++ b/assets/l10n/intl_pt_PT.arb
@@ -615,11 +615,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Descarregar ficheiro",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Editar",
"@edit": {
"type": "text",
@@ -1117,11 +1112,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Nova mensagem no FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Novo pedido de verificação!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_ru.arb b/assets/l10n/intl_ru.arb
index 6891e1c511..b99d9cfa01 100644
--- a/assets/l10n/intl_ru.arb
+++ b/assets/l10n/intl_ru.arb
@@ -644,11 +644,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Скачать файл",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Редактировать",
"@edit": {
"type": "text",
@@ -1159,11 +1154,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Новое сообщение во FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Новый запрос на подтверждение!",
"@newVerificationRequest": {
"type": "text",
@@ -2553,29 +2543,20 @@
"count": {}
}
},
- "onlineHourAgo": "был(а) в сети {hour} ч. {min} мин. назад",
+ "onlineHourAgo": "был(а) в сети {hour} ч",
"@onlineHourAgo": {
"placeholders": {
- "hour": {},
- "min": {}
+ "hour": {}
}
},
"onlineStatus": "онлайн",
"@onlineStatus": {},
- "onlineLongTimeAgo": "был(а) в сети давно",
- "@onlineLongTimeAgo": {},
"onlineMinAgo": "был(а) в сети {min} мин. назад",
"@onlineMinAgo": {
"placeholders": {
"min": {}
}
},
- "onlineDayAgo": "был(а) в сети {day} дня назад",
- "@onlineDayAgo": {
- "placeholders": {
- "day": {}
- }
- },
"chatCanHave": "В этом чате:",
"@chatCanHave": {},
"channels": "Каналы",
@@ -2613,18 +2594,6 @@
"type": "text",
"placeholders": {}
},
- "onlineWeekAgo": "был(а) в сети {week} недели назад",
- "@onlineWeekAgo": {
- "placeholders": {
- "week": {}
- }
- },
- "onlineMonthAgo": "был(а) в сети {month} месяца назад",
- "@onlineMonthAgo": {
- "placeholders": {
- "month": {}
- }
- },
"noMessageHereYet": "Здесь еще нет сообщений...",
"@noMessageHereYet": {},
"sendMessageGuide": "Отправьте сообщение или нажмите на приветствие.",
@@ -2790,5 +2759,146 @@
"searchSuggestion": "Вы можете искать пользователей по имени или публичному адресу сервера",
"@searchSuggestion": {},
"forwardTo": "Переслать...",
- "@forwardTo": {}
+ "@forwardTo": {},
+ "noMoreResult": "Больше нет результатов",
+ "@noMoreResult": {},
+ "errorPageTitle": "Что-то пошло не так",
+ "@errorPageTitle": {},
+ "chatFolders": "Папки",
+ "@chatFolders": {},
+ "errorPageDescription": "Этой страницы не существует.",
+ "@errorPageDescription": {},
+ "downloadImageError": "Не удалось сохранить",
+ "@downloadImageError": {},
+ "appLanguage": "Язык приложения",
+ "@appLanguage": {},
+ "copyMessageText": "Скопировать",
+ "@copyMessageText": {},
+ "membersInfo": "Участники ({count})",
+ "@membersInfo": {
+ "placeholders": {
+ "count": {}
+ }
+ },
+ "recentChat": "ПОСЛЕДНИЕ ЧАТЫ",
+ "@recentChat": {},
+ "muteThisMessage": "Отключить уведомления",
+ "@muteThisMessage": {},
+ "editProfileDescriptions": "Обновляйте профиль – имя, изображение и краткое описание.",
+ "@editProfileDescriptions": {},
+ "cannotEnableKeyBackup": "Невозможно включить резервное копирование. Попробуйте еще раз в настройках.",
+ "@cannotEnableKeyBackup": {
+ "type": "text",
+ "placeholders": {}
+ },
+ "settingsHelpSubtitle": "Помощь, обратная связь, политика конфиденциальности.",
+ "@settingsHelpSubtitle": {},
+ "errorPreviewingFile": "Предварительный просмотр недоступен",
+ "@errorPreviewingFile": {},
+ "unread": "Непрочитаное",
+ "@unread": {},
+ "company": "Компания",
+ "@company": {},
+ "addMembers": "Добавить участников",
+ "@addMembers": {},
+ "email": "Email",
+ "@email": {},
+ "bio": "Био (опционально)",
+ "@bio": {},
+ "searchForPeopleAndChannels": "Искать людей и каналы",
+ "@searchForPeopleAndChannels": {},
+ "markThisMessageAsRead": "Отметить как прочитанное",
+ "@markThisMessageAsRead": {},
+ "downloads": "Загрузки",
+ "@downloads": {},
+ "changeProfilePhoto": "Изменить фото профиля",
+ "@changeProfilePhoto": {},
+ "errorPageButton": "Назад к чату",
+ "@errorPageButton": {},
+ "playVideo": "Проиграть",
+ "@playVideo": {},
+ "settingsPrivacyAndSecuritySubtitle": "Блокировка контактов, исчезающие сообщения.",
+ "@settingsPrivacyAndSecuritySubtitle": {},
+ "copiedMatrixIdToClipboard": "Matrix ID скопирован в буфер обмена.",
+ "@copiedMatrixIdToClipboard": {},
+ "markThisMessageAsUnRead": "Отметить как непрочитанное",
+ "@markThisMessageAsUnRead": {},
+ "privacyAndSecurity": "Конфиденциальность и безопасность",
+ "@privacyAndSecurity": {},
+ "matrixId": "Matrix ID",
+ "@matrixId": {},
+ "roomCreationFailed": "Не удалось создать комнату",
+ "@roomCreationFailed": {},
+ "settingsAppLanguageSubtitle": "Английский (язык телефона).",
+ "@settingsAppLanguageSubtitle": {},
+ "settingsNotificationAndSoundsSubtitle": "Настройте уведомления от Twake – предварительный просмотр сообщений, звук, время и т. д.",
+ "@settingsNotificationAndSoundsSubtitle": {},
+ "mute": "Отключить уведомления",
+ "@mute": {},
+ "unpinThisMessage": "Открепить",
+ "@unpinThisMessage": {},
+ "notInAChatYet": "У вас еще нет чатов",
+ "@notInAChatYet": {},
+ "basicInfo": "ИНФОРМАЦИЯ ПРОФИЛЯ",
+ "@basicInfo": {},
+ "downloadFileInWeb": "Файл сохранен в {directory}",
+ "@downloadFileInWeb": {
+ "placeholders": {
+ "directory": {}
+ }
+ },
+ "previous": "Назад",
+ "@previous": {},
+ "files": "Файлы",
+ "@files": {},
+ "read": "Читать",
+ "@read": {},
+ "displayName": "Отображаемое имя",
+ "@displayName": {},
+ "select": "Выбрать",
+ "@select": {},
+ "blankChatTitle": "Выберите чат или нажмите на #EditIcon#, чтобы создать его.",
+ "@blankChatTitle": {},
+ "editWorkIdentitiesDescriptions": "Изменяйте свои идентификаторы, такие как Matrix ID, адрес электронной почты или название компании.",
+ "@editWorkIdentitiesDescriptions": {},
+ "links": "Ссылки",
+ "@links": {},
+ "downloadImageSuccess": "Изображение сохранено",
+ "@downloadImageSuccess": {},
+ "chatInfo": "Информация",
+ "@chatInfo": {},
+ "settingsDevicesSubtitle": "Контролируйте вход и выход на любом устройстве.",
+ "@settingsDevicesSubtitle": {},
+ "unmuteThisMessage": "Включить уведомления",
+ "@unmuteThisMessage": {},
+ "pinThisMessage": "Закрепить",
+ "@pinThisMessage": {},
+ "thisMessageHasBeenEncrypted": "Это сообщение зашифровано",
+ "@thisMessageHasBeenEncrypted": {},
+ "media": "Медиа",
+ "@media": {},
+ "cannotUnlockBackupKey": "Невозможно разблокировать резервную копию ключа.",
+ "@cannotUnlockBackupKey": {},
+ "workIdentitiesInfo": "ИДЕНТИФИКАТОРЫ",
+ "@workIdentitiesInfo": {},
+ "members": "Участники",
+ "@members": {},
+ "errorGettingPdf": "Не удалось загрузить PDF",
+ "@errorGettingPdf": {},
+ "unmute": "Включить уведомления",
+ "@unmute": {},
+ "selectChat": "Выбрать чат",
+ "@selectChat": {},
+ "add": "Добавить",
+ "@add": {},
+ "cannotUploadKey": "Невозможно сохранить резервную копию ключа.",
+ "@cannotUploadKey": {},
+ "notificationAndSounds": "Уведомления и звук",
+ "@notificationAndSounds": {},
+ "settingsChatSubtitle": "Внешний вид, темы, обои, история чата.",
+ "@settingsChatSubtitle": {},
+ "settingsChatFoldersSubtitle": "Создавайте папки для разных групп чатов и быстро переключайтесь между ними.",
+ "@settingsChatFoldersSubtitle": {},
+ "done": "Готово",
+ "@done": {}
}
diff --git a/assets/l10n/intl_sk.arb b/assets/l10n/intl_sk.arb
index c345c3e250..486cdb8083 100644
--- a/assets/l10n/intl_sk.arb
+++ b/assets/l10n/intl_sk.arb
@@ -400,11 +400,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Stiahnuť súbor",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"editDisplayname": "Zmeniť prezývku",
"@editDisplayname": {
"type": "text",
@@ -732,11 +727,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Nová správa v FluffyChate",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Nová žiadosť o verifikáciu!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_sr.arb b/assets/l10n/intl_sr.arb
index 2a537f5e04..e4128679e9 100644
--- a/assets/l10n/intl_sr.arb
+++ b/assets/l10n/intl_sr.arb
@@ -604,11 +604,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Преузми фајл",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Уреди",
"@edit": {
"type": "text",
@@ -1100,11 +1095,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "Нова порука — FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Нови захтев за верификацију!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_sv.arb b/assets/l10n/intl_sv.arb
index f2fee61625..5b5ff216e5 100644
--- a/assets/l10n/intl_sv.arb
+++ b/assets/l10n/intl_sv.arb
@@ -494,11 +494,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Ladda ner fil",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Ändra",
"@edit": {
"type": "text",
@@ -963,11 +958,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Nya meddelanden i FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Ny verifikationsbegäran!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_tr.arb b/assets/l10n/intl_tr.arb
index d3575b2189..bc90e63c9a 100644
--- a/assets/l10n/intl_tr.arb
+++ b/assets/l10n/intl_tr.arb
@@ -648,11 +648,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Dosyayı indir",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "Düzenle",
"@edit": {
"type": "text",
@@ -1163,11 +1158,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 FluffyChat'te yeni mesaj",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Yeni doğrulama isteği!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_uk.arb b/assets/l10n/intl_uk.arb
index f0788ffb94..26fbba2485 100644
--- a/assets/l10n/intl_uk.arb
+++ b/assets/l10n/intl_uk.arb
@@ -407,11 +407,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Завантажити файл",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"editDisplayname": "Змінити показуване ім'я",
"@editDisplayname": {
"type": "text",
@@ -746,11 +741,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Нове повідомлення у FluffyChat",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "Новий запит перевірки!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_vi.arb b/assets/l10n/intl_vi.arb
index fbd7e8c970..d0506644cb 100644
--- a/assets/l10n/intl_vi.arb
+++ b/assets/l10n/intl_vi.arb
@@ -126,8 +126,8 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "Tải ảnh xuống",
- "@downloadFile": {
+ "download": "Tải xuống",
+ "@download": {
"type": "text",
"placeholders": {}
},
@@ -1504,8 +1504,8 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 Tin nhắn mới trong FluffyChat",
- "@newMessageInFluffyChat": {
+ "newMessageInTwake": "Bạn có tin nhắn mới",
+ "@newMessageInTwake": {
"type": "text",
"placeholders": {}
},
@@ -2351,11 +2351,10 @@
},
"newGroupChat": "Nhóm trò chuyện mới",
"@newGroupChat": {},
- "onlineHourAgo": "trực truyến {hour} giờ {min} phút trước",
+ "onlineHourAgo": "trực truyến {hour} giờ trước",
"@onlineHourAgo": {
"placeholders": {
- "hour": {},
- "min": {}
+ "hour": {}
}
},
"addACaption": "Thêm chú thích...",
@@ -2368,12 +2367,6 @@
"username2": {}
}
},
- "onlineWeekAgo": "trực tuyến {week} tuần trước",
- "@onlineWeekAgo": {
- "placeholders": {
- "week": {}
- }
- },
"tuesday": "Thứ ba",
"@tuesday": {
"type": "text",
@@ -2397,8 +2390,6 @@
"type": "text",
"placeholders": {}
},
- "onlineLongTimeAgo": "trực tuyến một khoảng thời gian trước",
- "@onlineLongTimeAgo": {},
"reopenChat": "Mở lại cuộc trò chuyện",
"@reopenChat": {},
"inactive": "Chưa kích hoạt",
@@ -2570,12 +2561,6 @@
"targetName": {}
}
},
- "onlineDayAgo": "trực tuyến {day} ngày trước",
- "@onlineDayAgo": {
- "placeholders": {
- "day": {}
- }
- },
"tooManyRequestsWarning": "Quá nhiều yêu cầu. Vui lòng thử lại sau!",
"@tooManyRequestsWarning": {
"type": "text",
@@ -2658,12 +2643,6 @@
"@wrongServerName": {},
"twakeUsers": "Người dùng Twake",
"@twakeUsers": {},
- "onlineMonthAgo": "trực tuyến {month} tháng trước",
- "@onlineMonthAgo": {
- "placeholders": {
- "month": {}
- }
- },
"newGroup": "Cuộc trò chuyện mới",
"@newGroup": {},
"enterInviteLinkOrMatrixId": "Nhập liên kết mời hoặc Matrix ID...",
diff --git a/assets/l10n/intl_zh.arb b/assets/l10n/intl_zh.arb
index 1090ad70ad..e3093c673d 100644
--- a/assets/l10n/intl_zh.arb
+++ b/assets/l10n/intl_zh.arb
@@ -622,11 +622,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "下载文件",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "编辑",
"@edit": {
"type": "text",
@@ -1118,11 +1113,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "💬 FluffyChat 新消息",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "新的验证请求!",
"@newVerificationRequest": {
"type": "text",
diff --git a/assets/l10n/intl_zh_Hant.arb b/assets/l10n/intl_zh_Hant.arb
index 72208a70cf..de0a750add 100644
--- a/assets/l10n/intl_zh_Hant.arb
+++ b/assets/l10n/intl_zh_Hant.arb
@@ -527,11 +527,6 @@
"type": "text",
"placeholders": {}
},
- "downloadFile": "下載文件",
- "@downloadFile": {
- "type": "text",
- "placeholders": {}
- },
"edit": "編輯",
"@edit": {
"type": "text",
@@ -1006,11 +1001,6 @@
"type": "text",
"placeholders": {}
},
- "newMessageInFluffyChat": "來自 FluffyChat 的新訊息",
- "@newMessageInFluffyChat": {
- "type": "text",
- "placeholders": {}
- },
"newVerificationRequest": "新的驗證請求!",
"@newVerificationRequest": {
"type": "text",
diff --git a/fonts/NotoEmoji/NotoColorEmoji.ttf b/fonts/NotoEmoji/NotoColorEmoji.ttf
deleted file mode 100644
index 8ebcc8fde2..0000000000
Binary files a/fonts/NotoEmoji/NotoColorEmoji.ttf and /dev/null differ
diff --git a/fonts/NotoEmoji/NotoEmoji-Regular.ttf b/fonts/NotoEmoji/NotoEmoji-Regular.ttf
deleted file mode 100644
index f3b247d43d..0000000000
Binary files a/fonts/NotoEmoji/NotoEmoji-Regular.ttf and /dev/null differ
diff --git a/integration_test/app_test.dart b/integration_test/app_test.dart
index 4e7b8be862..eec6f1b5a1 100644
--- a/integration_test/app_test.dart
+++ b/integration_test/app_test.dart
@@ -1,6 +1,6 @@
import 'package:fluffychat/config/setting_keys.dart';
import 'package:fluffychat/pages/chat/chat_view.dart';
-import 'package:fluffychat/pages/chat_list/chat_list_body.dart';
+import 'package:fluffychat/pages/chat_list/chat_list_body_view.dart';
import 'package:fluffychat/pages/chat_list/search_title.dart';
import 'package:fluffychat/pages/new_group/contacts_selection_view.dart';
@@ -66,7 +66,7 @@ void main() {
500,
scrollable: find
.descendant(
- of: find.byType(ChatListViewBody),
+ of: find.byType(ChatListBodyView),
matching: find.byType(Scrollable),
)
.first,
@@ -82,7 +82,7 @@ void main() {
500,
scrollable: find
.descendant(
- of: find.byType(ChatListViewBody),
+ of: find.byType(ChatListBodyView),
matching: find.byType(Scrollable),
)
.first,
diff --git a/integration_test/extensions/default_flows.dart b/integration_test/extensions/default_flows.dart
index 6609969004..eb642625a4 100644
--- a/integration_test/extensions/default_flows.dart
+++ b/integration_test/extensions/default_flows.dart
@@ -1,6 +1,6 @@
import 'dart:developer';
-import 'package:fluffychat/pages/chat_list/chat_list_body.dart';
+import 'package:fluffychat/pages/chat_list/chat_list_body_view.dart';
import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
@@ -82,7 +82,7 @@ extension DefaultFlowExtensions on WidgetTester {
}
await tester.waitFor(
- find.byType(ChatListViewBody),
+ find.byType(ChatListBodyView),
skipPumpAndSettle: true,
);
}
@@ -105,7 +105,7 @@ extension DefaultFlowExtensions on WidgetTester {
Future ensureLoggedOut() async {
final tester = this;
await tester.pumpAndSettle();
- if (find.byType(ChatListViewBody).evaluate().isNotEmpty) {
+ if (find.byType(ChatListBodyView).evaluate().isNotEmpty) {
await tester.tap(find.byTooltip('Show menu'));
await tester.pumpAndSettle();
await tester.tap(find.text('Settings'));
@@ -133,7 +133,7 @@ extension DefaultFlowExtensions on WidgetTester {
await tester.pumpAndSettle();
final homeserverPickerFinder = find.byType(HomeserverPicker);
- final chatListFinder = find.byType(ChatListViewBody);
+ final chatListFinder = find.byType(ChatListBodyView);
final end = DateTime.now().add(timeout);
diff --git a/ios/FluffyChat Share/Base.lproj/MainInterface.storyboard b/ios/FluffyChat Share/Base.lproj/MainInterface.storyboard
deleted file mode 100644
index 286a50894d..0000000000
--- a/ios/FluffyChat Share/Base.lproj/MainInterface.storyboard
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/ios/Podfile b/ios/Podfile
index 95b266171d..90a88d6855 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -32,6 +32,10 @@ target 'Runner' do
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+
+ target 'Twake Share' do
+ inherit! :search_paths
+ end
end
post_install do |installer|
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index 38be348e90..cf83010208 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -11,14 +11,14 @@
0611A7F22A678C7700F180CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0611A7F42A678C7700F180CC /* Localizable.strings */; };
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 643D9A430DCE4893FC15438F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B16AB66899BBD65C9BFB2599 /* Pods_Runner.framework */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 81048B2F1319025A0C39525B /* Pods_Twake_Share.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8CAF7CDF8EA1DB709D295C3 /* Pods_Twake_Share.framework */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
- AB0F2865DE230DE37373E0E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */; };
C1005C45261071B5002F4F32 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1005C44261071B5002F4F32 /* ShareViewController.swift */; };
- C1005C48261071B5002F4F32 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C1005C46261071B5002F4F32 /* MainInterface.storyboard */; };
- C1005C4C261071B5002F4F32 /* FluffyChat Share.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C1005C42261071B5002F4F32 /* FluffyChat Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+ C1005C4C261071B5002F4F32 /* Twake Share.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C1005C42261071B5002F4F32 /* Twake Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
C149567C25C7274F00A16396 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C149567B25C7274F00A16396 /* GoogleService-Info.plist */; };
/* End PBXBuildFile section */
@@ -28,7 +28,7 @@
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
proxyType = 1;
remoteGlobalIDString = C1005C41261071B5002F4F32;
- remoteInfo = "FluffyChat Share";
+ remoteInfo = "Twake Share";
};
/* End PBXContainerItemProxy section */
@@ -49,7 +49,7 @@
dstPath = "";
dstSubfolderSpec = 13;
files = (
- C1005C4C261071B5002F4F32 /* FluffyChat Share.appex in Embed App Extensions */,
+ C1005C4C261071B5002F4F32 /* Twake Share.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
@@ -58,13 +58,88 @@
/* Begin PBXFileReference section */
0611A7F32A678C7700F180CC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB3E12ADE390500E09F51 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB3E22ADE39B400E09F51 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Main.strings; sourceTree = ""; };
+ 06AAB3E32ADE39B400E09F51 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB3E42ADE39B400E09F51 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB3E62ADE39C100E09F51 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Main.strings; sourceTree = ""; };
+ 06AAB3E72ADE39C100E09F51 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB3E82ADE39C200E09F51 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB3EA2ADE39CA00E09F51 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = ""; };
+ 06AAB3EB2ADE39CA00E09F51 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB3EC2ADE39CB00E09F51 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB3EE2ADE39EB00E09F51 /* eo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eo; path = eo.lproj/Main.strings; sourceTree = ""; };
+ 06AAB3EF2ADE39EB00E09F51 /* eo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eo; path = eo.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB3F02ADE39EB00E09F51 /* eo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eo; path = eo.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB3F22ADE39FA00E09F51 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Main.strings; sourceTree = ""; };
+ 06AAB3F32ADE39FA00E09F51 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB3F42ADE39FB00E09F51 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB3F62ADE3A1E00E09F51 /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Main.strings; sourceTree = ""; };
+ 06AAB3F72ADE3A1E00E09F51 /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB3F82ADE3A1E00E09F51 /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB3FA2ADE3B0400E09F51 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Main.strings; sourceTree = ""; };
+ 06AAB3FB2ADE3B0400E09F51 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB3FC2ADE3B0400E09F51 /* eu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = eu; path = eu.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB3FE2ADE3BE200E09F51 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = ""; };
+ 06AAB3FF2ADE3BE200E09F51 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB4002ADE3BE200E09F51 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB4012ADE3C1400E09F51 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/Main.strings; sourceTree = ""; };
+ 06AAB4022ADE3C1400E09F51 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB4032ADE3C1400E09F51 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = gl.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB4042ADE3C3100E09F51 /* hu-HU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hu-HU"; path = "hu-HU.lproj/Main.strings"; sourceTree = ""; };
+ 06AAB4052ADE3C3100E09F51 /* hu-HU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hu-HU"; path = "hu-HU.lproj/LaunchScreen.strings"; sourceTree = ""; };
+ 06AAB4062ADE3C3100E09F51 /* hu-HU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hu-HU"; path = "hu-HU.lproj/Localizable.strings"; sourceTree = ""; };
+ 06AAB4072ADE3C7A00E09F51 /* hr-HR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hr-HR"; path = "hr-HR.lproj/Main.strings"; sourceTree = ""; };
+ 06AAB4082ADE3C7A00E09F51 /* hr-HR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hr-HR"; path = "hr-HR.lproj/LaunchScreen.strings"; sourceTree = ""; };
+ 06AAB4092ADE3C7A00E09F51 /* hr-HR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "hr-HR"; path = "hr-HR.lproj/Localizable.strings"; sourceTree = ""; };
+ 06AAB40A2ADE3CB600E09F51 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Main.strings; sourceTree = ""; };
+ 06AAB40B2ADE3CB600E09F51 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB40C2ADE3CB600E09F51 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB40D2ADE3CFD00E09F51 /* hy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hy; path = hy.lproj/Main.strings; sourceTree = ""; };
+ 06AAB40E2ADE3CFE00E09F51 /* hy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hy; path = hy.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB40F2ADE3CFE00E09F51 /* hy */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hy; path = hy.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB4102ADE3D0D00E09F51 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Main.strings; sourceTree = ""; };
+ 06AAB4112ADE3D0D00E09F51 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB4122ADE3D0D00E09F51 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB4132ADE3D2200E09F51 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; };
+ 06AAB4142ADE3D2200E09F51 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB4152ADE3D2200E09F51 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB4162ADE3D9D00E09F51 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/Main.strings"; sourceTree = ""; };
+ 06AAB4172ADE3D9D00E09F51 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/LaunchScreen.strings"; sourceTree = ""; };
+ 06AAB4182ADE3D9D00E09F51 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/Localizable.strings"; sourceTree = ""; };
+ 06AAB4192ADE3DB700E09F51 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Main.strings; sourceTree = ""; };
+ 06AAB41A2ADE3DB700E09F51 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB41B2ADE3DB700E09F51 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB41C2ADE3DCA00E09F51 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Main.strings; sourceTree = ""; };
+ 06AAB41D2ADE3DCA00E09F51 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB41E2ADE3DCA00E09F51 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB41F2ADE3DD900E09F51 /* ru-RU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ru-RU"; path = "ru-RU.lproj/Main.strings"; sourceTree = ""; };
+ 06AAB4202ADE3DD900E09F51 /* ru-RU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ru-RU"; path = "ru-RU.lproj/LaunchScreen.strings"; sourceTree = ""; };
+ 06AAB4212ADE3DDA00E09F51 /* ru-RU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "ru-RU"; path = "ru-RU.lproj/Localizable.strings"; sourceTree = ""; };
+ 06AAB4222ADE3E3000E09F51 /* sk-SK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sk-SK"; path = "sk-SK.lproj/Main.strings"; sourceTree = ""; };
+ 06AAB4232ADE3E3000E09F51 /* sk-SK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sk-SK"; path = "sk-SK.lproj/LaunchScreen.strings"; sourceTree = ""; };
+ 06AAB4242ADE3E3000E09F51 /* sk-SK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sk-SK"; path = "sk-SK.lproj/Localizable.strings"; sourceTree = ""; };
+ 06AAB4252ADE3E5100E09F51 /* sv-SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sv-SE"; path = "sv-SE.lproj/Main.strings"; sourceTree = ""; };
+ 06AAB4262ADE3E5100E09F51 /* sv-SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sv-SE"; path = "sv-SE.lproj/LaunchScreen.strings"; sourceTree = ""; };
+ 06AAB4272ADE3E5100E09F51 /* sv-SE */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "sv-SE"; path = "sv-SE.lproj/Localizable.strings"; sourceTree = ""; };
+ 06AAB4282ADE3F5200E09F51 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Main.strings; sourceTree = ""; };
+ 06AAB4292ADE3F5200E09F51 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB42A2ADE3F5200E09F51 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB42B2ADE3F6A00E09F51 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Main.strings; sourceTree = ""; };
+ 06AAB42C2ADE3F6A00E09F51 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/LaunchScreen.strings; sourceTree = ""; };
+ 06AAB42D2ADE3F6A00E09F51 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; };
+ 06AAB42E2ADE3F7700E09F51 /* vi-VN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "vi-VN"; path = "vi-VN.lproj/Main.strings"; sourceTree = ""; };
+ 06AAB42F2ADE3F7700E09F51 /* vi-VN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "vi-VN"; path = "vi-VN.lproj/LaunchScreen.strings"; sourceTree = ""; };
+ 06AAB4302ADE3F7700E09F51 /* vi-VN */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "vi-VN"; path = "vi-VN.lproj/Localizable.strings"; sourceTree = ""; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 1B6C59111A74FF0BB750A10A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ 216064C73ECC2AECB9F0A1FA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
- 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 536699DF3AE0B9D3AF31677B /* Pods-Twake Share.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Twake Share.profile.xcconfig"; path = "Target Support Files/Pods-Twake Share/Pods-Twake Share.profile.xcconfig"; sourceTree = ""; };
+ 539142E4CD4E28C397AF0C3B /* Pods-Twake Share.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Twake Share.debug.xcconfig"; path = "Target Support Files/Pods-Twake Share/Pods-Twake Share.debug.xcconfig"; sourceTree = ""; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
- 76737C9A857D5FD6D2634A3F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
@@ -73,15 +148,16 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- 9DB2F3524376810E74C799A8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
- C1005C42261071B5002F4F32 /* FluffyChat Share.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "FluffyChat Share.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
+ B16AB66899BBD65C9BFB2599 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ B8CAF7CDF8EA1DB709D295C3 /* Pods_Twake_Share.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Twake_Share.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ BA9BBC5546D378D952097E1E /* Pods-Twake Share.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Twake Share.release.xcconfig"; path = "Target Support Files/Pods-Twake Share/Pods-Twake Share.release.xcconfig"; sourceTree = ""; };
+ C1005C42261071B5002F4F32 /* Twake Share.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Twake Share.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
C1005C44261071B5002F4F32 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = ""; };
- C1005C47261071B5002F4F32 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; };
C1005C49261071B5002F4F32 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- C1005C53261072D4002F4F32 /* FluffyChat Share.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "FluffyChat Share.entitlements"; sourceTree = ""; };
+ C1005C53261072D4002F4F32 /* Twake Share.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Twake Share.entitlements"; sourceTree = ""; };
C149567B25C7274F00A16396 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; };
C149567D25C7276200A16396 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; };
- EA246783222E02DD03959891 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ FDBA7311CF00074CB7786C33 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -89,7 +165,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- AB0F2865DE230DE37373E0E0 /* Pods_Runner.framework in Frameworks */,
+ 643D9A430DCE4893FC15438F /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -97,16 +173,18 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 81048B2F1319025A0C39525B /* Pods_Twake_Share.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 075EE1BE25359E34308E0B78 /* Frameworks */ = {
+ 17347C56C756794A41C124FE /* Frameworks */ = {
isa = PBXGroup;
children = (
- 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */,
+ B16AB66899BBD65C9BFB2599 /* Pods_Runner.framework */,
+ B8CAF7CDF8EA1DB709D295C3 /* Pods_Twake_Share.framework */,
);
name = Frameworks;
sourceTree = "";
@@ -118,7 +196,6 @@
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
- 0611A7F42A678C7700F180CC /* Localizable.strings */,
);
name = Flutter;
sourceTree = "";
@@ -128,10 +205,10 @@
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
- C1005C43261071B5002F4F32 /* FluffyChat Share */,
+ C1005C43261071B5002F4F32 /* Twake Share */,
97C146EF1CF9000F007C117D /* Products */,
E89DCAC000D371640E94E65B /* Pods */,
- 075EE1BE25359E34308E0B78 /* Frameworks */,
+ 17347C56C756794A41C124FE /* Frameworks */,
);
sourceTree = "";
};
@@ -139,7 +216,7 @@
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
- C1005C42261071B5002F4F32 /* FluffyChat Share.appex */,
+ C1005C42261071B5002F4F32 /* Twake Share.appex */,
);
name = Products;
sourceTree = "";
@@ -147,6 +224,7 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
+ 0611A7F42A678C7700F180CC /* Localizable.strings */,
C149567D25C7276200A16396 /* Runner.entitlements */,
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
@@ -161,23 +239,25 @@
path = Runner;
sourceTree = "";
};
- C1005C43261071B5002F4F32 /* FluffyChat Share */ = {
+ C1005C43261071B5002F4F32 /* Twake Share */ = {
isa = PBXGroup;
children = (
- C1005C53261072D4002F4F32 /* FluffyChat Share.entitlements */,
+ C1005C53261072D4002F4F32 /* Twake Share.entitlements */,
C1005C44261071B5002F4F32 /* ShareViewController.swift */,
- C1005C46261071B5002F4F32 /* MainInterface.storyboard */,
C1005C49261071B5002F4F32 /* Info.plist */,
);
- path = "FluffyChat Share";
+ path = "Twake Share";
sourceTree = "";
};
E89DCAC000D371640E94E65B /* Pods */ = {
isa = PBXGroup;
children = (
- 76737C9A857D5FD6D2634A3F /* Pods-Runner.debug.xcconfig */,
- EA246783222E02DD03959891 /* Pods-Runner.release.xcconfig */,
- 9DB2F3524376810E74C799A8 /* Pods-Runner.profile.xcconfig */,
+ 1B6C59111A74FF0BB750A10A /* Pods-Runner.debug.xcconfig */,
+ FDBA7311CF00074CB7786C33 /* Pods-Runner.release.xcconfig */,
+ 216064C73ECC2AECB9F0A1FA /* Pods-Runner.profile.xcconfig */,
+ 539142E4CD4E28C397AF0C3B /* Pods-Twake Share.debug.xcconfig */,
+ BA9BBC5546D378D952097E1E /* Pods-Twake Share.release.xcconfig */,
+ 536699DF3AE0B9D3AF31677B /* Pods-Twake Share.profile.xcconfig */,
);
path = Pods;
sourceTree = "";
@@ -189,7 +269,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
- 8C9CCA7C5C45651F90C7BFDD /* [CP] Check Pods Manifest.lock */,
+ 976327FA3CEAB4BFF28CC739 /* [CP] Check Pods Manifest.lock */,
C1005C4D261071B5002F4F32 /* Embed App Extensions */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
@@ -197,7 +277,7 @@
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */,
+ 5F91C032622C7759B233FC58 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -209,10 +289,11 @@
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
- C1005C41261071B5002F4F32 /* FluffyChat Share */ = {
+ C1005C41261071B5002F4F32 /* Twake Share */ = {
isa = PBXNativeTarget;
- buildConfigurationList = C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "FluffyChat Share" */;
+ buildConfigurationList = C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "Twake Share" */;
buildPhases = (
+ F147DF49C55416DBE4109E8B /* [CP] Check Pods Manifest.lock */,
C1005C3E261071B5002F4F32 /* Sources */,
C1005C3F261071B5002F4F32 /* Frameworks */,
C1005C40261071B5002F4F32 /* Resources */,
@@ -221,9 +302,9 @@
);
dependencies = (
);
- name = "FluffyChat Share";
- productName = "FluffyChat Share";
- productReference = C1005C42261071B5002F4F32 /* FluffyChat Share.appex */;
+ name = "Twake Share";
+ productName = "Twake Share";
+ productReference = C1005C42261071B5002F4F32 /* Twake Share.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */
@@ -252,6 +333,31 @@
knownRegions = (
en,
Base,
+ ar,
+ ca,
+ cs,
+ de,
+ eo,
+ es,
+ et,
+ eu,
+ fr,
+ gl,
+ "hu-HU",
+ "hr-HR",
+ hu,
+ hy,
+ it,
+ ja,
+ "nb-NO",
+ pl,
+ pt,
+ "ru-RU",
+ "sk-SK",
+ "sv-SE",
+ tr,
+ uk,
+ "vi-VN",
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
@@ -259,7 +365,7 @@
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
- C1005C41261071B5002F4F32 /* FluffyChat Share */,
+ C1005C41261071B5002F4F32 /* Twake Share */,
);
};
/* End PBXProject section */
@@ -282,7 +388,6 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- C1005C48261071B5002F4F32 /* MainInterface.storyboard in Resources */,
0611A7F22A678C7700F180CC /* Localizable.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -306,26 +411,21 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
- 8C9CCA7C5C45651F90C7BFDD /* [CP] Check Pods Manifest.lock */ = {
+ 5F91C032622C7759B233FC58 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
- inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
+ name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
- );
- outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
@@ -343,21 +443,48 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
- F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */ = {
+ 976327FA3CEAB4BFF28CC739 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
- name = "[CP] Embed Pods Frameworks";
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ F147DF49C55416DBE4109E8B /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Twake Share-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
@@ -385,7 +512,7 @@
/* Begin PBXTargetDependency section */
C1005C4B261071B5002F4F32 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
- target = C1005C41261071B5002F4F32 /* FluffyChat Share */;
+ target = C1005C41261071B5002F4F32 /* Twake Share */;
targetProxy = C1005C4A261071B5002F4F32 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@@ -395,6 +522,31 @@
isa = PBXVariantGroup;
children = (
0611A7F32A678C7700F180CC /* en */,
+ 06AAB3E12ADE390500E09F51 /* ar */,
+ 06AAB3E42ADE39B400E09F51 /* ca */,
+ 06AAB3E82ADE39C200E09F51 /* cs */,
+ 06AAB3EC2ADE39CB00E09F51 /* de */,
+ 06AAB3F02ADE39EB00E09F51 /* eo */,
+ 06AAB3F42ADE39FB00E09F51 /* es */,
+ 06AAB3F82ADE3A1E00E09F51 /* et */,
+ 06AAB3FC2ADE3B0400E09F51 /* eu */,
+ 06AAB4002ADE3BE200E09F51 /* fr */,
+ 06AAB4032ADE3C1400E09F51 /* gl */,
+ 06AAB4062ADE3C3100E09F51 /* hu-HU */,
+ 06AAB4092ADE3C7A00E09F51 /* hr-HR */,
+ 06AAB40C2ADE3CB600E09F51 /* hu */,
+ 06AAB40F2ADE3CFE00E09F51 /* hy */,
+ 06AAB4122ADE3D0D00E09F51 /* it */,
+ 06AAB4152ADE3D2200E09F51 /* ja */,
+ 06AAB4182ADE3D9D00E09F51 /* nb-NO */,
+ 06AAB41B2ADE3DB700E09F51 /* pl */,
+ 06AAB41E2ADE3DCA00E09F51 /* pt */,
+ 06AAB4212ADE3DDA00E09F51 /* ru-RU */,
+ 06AAB4242ADE3E3000E09F51 /* sk-SK */,
+ 06AAB4272ADE3E5100E09F51 /* sv-SE */,
+ 06AAB42A2ADE3F5200E09F51 /* tr */,
+ 06AAB42D2ADE3F6A00E09F51 /* uk */,
+ 06AAB4302ADE3F7700E09F51 /* vi-VN */,
);
name = Localizable.strings;
sourceTree = "";
@@ -403,6 +555,30 @@
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
+ 06AAB3E22ADE39B400E09F51 /* ca */,
+ 06AAB3E62ADE39C100E09F51 /* cs */,
+ 06AAB3EA2ADE39CA00E09F51 /* de */,
+ 06AAB3EE2ADE39EB00E09F51 /* eo */,
+ 06AAB3F22ADE39FA00E09F51 /* es */,
+ 06AAB3F62ADE3A1E00E09F51 /* et */,
+ 06AAB3FA2ADE3B0400E09F51 /* eu */,
+ 06AAB3FE2ADE3BE200E09F51 /* fr */,
+ 06AAB4012ADE3C1400E09F51 /* gl */,
+ 06AAB4042ADE3C3100E09F51 /* hu-HU */,
+ 06AAB4072ADE3C7A00E09F51 /* hr-HR */,
+ 06AAB40A2ADE3CB600E09F51 /* hu */,
+ 06AAB40D2ADE3CFD00E09F51 /* hy */,
+ 06AAB4102ADE3D0D00E09F51 /* it */,
+ 06AAB4132ADE3D2200E09F51 /* ja */,
+ 06AAB4162ADE3D9D00E09F51 /* nb-NO */,
+ 06AAB4192ADE3DB700E09F51 /* pl */,
+ 06AAB41C2ADE3DCA00E09F51 /* pt */,
+ 06AAB41F2ADE3DD900E09F51 /* ru-RU */,
+ 06AAB4222ADE3E3000E09F51 /* sk-SK */,
+ 06AAB4252ADE3E5100E09F51 /* sv-SE */,
+ 06AAB4282ADE3F5200E09F51 /* tr */,
+ 06AAB42B2ADE3F6A00E09F51 /* uk */,
+ 06AAB42E2ADE3F7700E09F51 /* vi-VN */,
);
name = Main.storyboard;
sourceTree = "";
@@ -411,18 +587,34 @@
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
+ 06AAB3E32ADE39B400E09F51 /* ca */,
+ 06AAB3E72ADE39C100E09F51 /* cs */,
+ 06AAB3EB2ADE39CA00E09F51 /* de */,
+ 06AAB3EF2ADE39EB00E09F51 /* eo */,
+ 06AAB3F32ADE39FA00E09F51 /* es */,
+ 06AAB3F72ADE3A1E00E09F51 /* et */,
+ 06AAB3FB2ADE3B0400E09F51 /* eu */,
+ 06AAB3FF2ADE3BE200E09F51 /* fr */,
+ 06AAB4022ADE3C1400E09F51 /* gl */,
+ 06AAB4052ADE3C3100E09F51 /* hu-HU */,
+ 06AAB4082ADE3C7A00E09F51 /* hr-HR */,
+ 06AAB40B2ADE3CB600E09F51 /* hu */,
+ 06AAB40E2ADE3CFE00E09F51 /* hy */,
+ 06AAB4112ADE3D0D00E09F51 /* it */,
+ 06AAB4142ADE3D2200E09F51 /* ja */,
+ 06AAB4172ADE3D9D00E09F51 /* nb-NO */,
+ 06AAB41A2ADE3DB700E09F51 /* pl */,
+ 06AAB41D2ADE3DCA00E09F51 /* pt */,
+ 06AAB4202ADE3DD900E09F51 /* ru-RU */,
+ 06AAB4232ADE3E3000E09F51 /* sk-SK */,
+ 06AAB4262ADE3E5100E09F51 /* sv-SE */,
+ 06AAB4292ADE3F5200E09F51 /* tr */,
+ 06AAB42C2ADE3F6A00E09F51 /* uk */,
+ 06AAB42F2ADE3F7700E09F51 /* vi-VN */,
);
name = LaunchScreen.storyboard;
sourceTree = "";
};
- C1005C46261071B5002F4F32 /* MainInterface.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- C1005C47261071B5002F4F32 /* Base */,
- );
- name = MainInterface.storyboard;
- sourceTree = "";
- };
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
@@ -430,6 +622,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -484,9 +677,11 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1;
+ CUSTOM_GROUP_ID = group.com.linagora.ios.twake;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29;
ENABLE_BITCODE = NO;
@@ -506,7 +701,7 @@
MARKETING_VERSION = 0.32.1;
PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake;
PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "";
+ PROVISIONING_PROFILE_SPECIFIER = twake.development.profile;
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.development.profile;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -518,6 +713,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -573,6 +769,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -629,9 +826,11 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
+ CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1;
+ CUSTOM_GROUP_ID = group.com.linagora.ios.twake;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29;
ENABLE_BITCODE = NO;
@@ -651,7 +850,7 @@
MARKETING_VERSION = 0.32.1;
PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake;
PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "";
+ PROVISIONING_PROFILE_SPECIFIER = twake.development.profile;
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.development.profile;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
@@ -672,6 +871,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1;
+ CUSTOM_GROUP_ID = group.com.linagora.ios.twake;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29;
ENABLE_BITCODE = NO;
@@ -691,7 +891,7 @@
MARKETING_VERSION = 0.32.1;
PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake;
PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "";
+ PROVISIONING_PROFILE_SPECIFIER = twake.distribution.profile;
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.distribution.profile;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
@@ -701,6 +901,7 @@
};
C1005C4E261071B5002F4F32 /* Debug */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 539142E4CD4E28C397AF0C3B /* Pods-Twake Share.debug.xcconfig */;
buildSettings = {
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -708,27 +909,28 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CODE_SIGN_ENTITLEMENTS = "FluffyChat Share/FluffyChat Share.entitlements";
+ CODE_SIGN_ENTITLEMENTS = "Twake Share/Twake Share.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1;
+ CUSTOM_GROUP_ID = group.com.linagora.ios.twake;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29;
GCC_C_LANGUAGE_STANDARD = gnu11;
- INFOPLIST_FILE = "FluffyChat Share/Info.plist";
+ INFOPLIST_FILE = "Twake Share/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
- MARKETING_VERSION = 1.0.0;
+ MARKETING_VERSION = 2.3.2;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "";
+ PROVISIONING_PROFILE_SPECIFIER = twake.share.ext.development.profile;
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.share.ext.development.profile;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
@@ -740,6 +942,7 @@
};
C1005C4F261071B5002F4F32 /* Release */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = BA9BBC5546D378D952097E1E /* Pods-Twake Share.release.xcconfig */;
buildSettings = {
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -747,26 +950,27 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CODE_SIGN_ENTITLEMENTS = "FluffyChat Share/FluffyChat Share.entitlements";
+ CODE_SIGN_ENTITLEMENTS = "Twake Share/Twake Share.entitlements";
CODE_SIGN_IDENTITY = "Apple Distribution";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1;
+ CUSTOM_GROUP_ID = group.com.linagora.ios.twake;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29;
GCC_C_LANGUAGE_STANDARD = gnu11;
- INFOPLIST_FILE = "FluffyChat Share/Info.plist";
+ INFOPLIST_FILE = "Twake Share/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
- MARKETING_VERSION = 1.0.0;
+ MARKETING_VERSION = 2.3.2;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "";
+ PROVISIONING_PROFILE_SPECIFIER = twake.share.ext.distribution.profile;
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.share.ext.distribution.profile;
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
@@ -776,6 +980,7 @@
};
C1005C50261071B5002F4F32 /* Profile */ = {
isa = XCBuildConfiguration;
+ baseConfigurationReference = 536699DF3AE0B9D3AF31677B /* Pods-Twake Share.profile.xcconfig */;
buildSettings = {
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -783,26 +988,27 @@
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CODE_SIGN_ENTITLEMENTS = "FluffyChat Share/FluffyChat Share.entitlements";
+ CODE_SIGN_ENTITLEMENTS = "Twake Share/Twake Share.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 1;
+ CUSTOM_GROUP_ID = group.com.linagora.ios.twake;
DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29;
GCC_C_LANGUAGE_STANDARD = gnu11;
- INFOPLIST_FILE = "FluffyChat Share/Info.plist";
+ INFOPLIST_FILE = "Twake Share/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
- MARKETING_VERSION = 1.0.0;
+ MARKETING_VERSION = 2.3.2;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "";
+ PROVISIONING_PROFILE_SPECIFIER = twake.share.ext.development.profile;
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.share.ext.development.profile;
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
@@ -833,7 +1039,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "FluffyChat Share" */ = {
+ C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "Twake Share" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C1005C4E261071B5002F4F32 /* Debug */,
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index c34a50fe35..6f19754984 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -2,6 +2,8 @@
+ AppGroupId
+ $(CUSTOM_GROUP_ID)
BGTaskSchedulerPermittedIdentifiers
im.fluffychat.app
diff --git a/ios/Runner/ar.lproj/Localizable.strings b/ios/Runner/ar.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/ar.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/ca.lproj/Localizable.strings b/ios/Runner/ca.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/ca.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/cs.lproj/Localizable.strings b/ios/Runner/cs.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/cs.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/de.lproj/Localizable.strings b/ios/Runner/de.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/de.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/en.lproj/Localizable.strings b/ios/Runner/en.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/en.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/eo.lproj/Localizable.strings b/ios/Runner/eo.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/eo.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/es.lproj/Localizable.strings b/ios/Runner/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/es.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/et.lproj/Localizable.strings b/ios/Runner/et.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/et.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/eu.lproj/Localizable.strings b/ios/Runner/eu.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/eu.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/fr.lproj/Localizable.strings b/ios/Runner/fr.lproj/Localizable.strings
new file mode 100644
index 0000000000..debec9ea4c
--- /dev/null
+++ b/ios/Runner/fr.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "Vous avez un message chiffré";
diff --git a/ios/Runner/gl.lproj/Localizable.strings b/ios/Runner/gl.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/gl.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/hr-HR.lproj/Localizable.strings b/ios/Runner/hr-HR.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/hr-HR.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/hu-HU.lproj/Localizable.strings b/ios/Runner/hu-HU.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/hu-HU.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/hu.lproj/Localizable.strings b/ios/Runner/hu.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/hu.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/hy.lproj/Localizable.strings b/ios/Runner/hy.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/hy.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/it.lproj/Localizable.strings b/ios/Runner/it.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/it.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/ja.lproj/Localizable.strings b/ios/Runner/ja.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/ja.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/nb-NO.lproj/Localizable.strings b/ios/Runner/nb-NO.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/nb-NO.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/pl.lproj/Localizable.strings b/ios/Runner/pl.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/pl.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/pt.lproj/Localizable.strings b/ios/Runner/pt.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/pt.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/ru-RU.lproj/Localizable.strings b/ios/Runner/ru-RU.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/ru-RU.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/sk-SK.lproj/Localizable.strings b/ios/Runner/sk-SK.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/sk-SK.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/sv-SE.lproj/Localizable.strings b/ios/Runner/sv-SE.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/sv-SE.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/tr.lproj/Localizable.strings b/ios/Runner/tr.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/tr.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/uk.lproj/Localizable.strings b/ios/Runner/uk.lproj/Localizable.strings
new file mode 100644
index 0000000000..18d97c2da4
--- /dev/null
+++ b/ios/Runner/uk.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "You have 1 encrypted message";
diff --git a/ios/Runner/vi-VN.lproj/Localizable.strings b/ios/Runner/vi-VN.lproj/Localizable.strings
new file mode 100644
index 0000000000..99ac00bb44
--- /dev/null
+++ b/ios/Runner/vi-VN.lproj/Localizable.strings
@@ -0,0 +1 @@
+"newMessageInTwake" = "Bạn có tin nhắn mới";
diff --git a/ios/FluffyChat Share/Info.plist b/ios/Twake Share/Info.plist
similarity index 96%
rename from ios/FluffyChat Share/Info.plist
rename to ios/Twake Share/Info.plist
index 922c4643fc..528bcbc4a3 100644
--- a/ios/FluffyChat Share/Info.plist
+++ b/ios/Twake Share/Info.plist
@@ -2,6 +2,8 @@
+ AppGroupId
+ $(CUSTOM_GROUP_ID)
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleDisplayName
diff --git a/ios/FluffyChat Share/ShareViewController.swift b/ios/Twake Share/ShareViewController.swift
similarity index 77%
rename from ios/FluffyChat Share/ShareViewController.swift
rename to ios/Twake Share/ShareViewController.swift
index e56ab17539..11e5728d23 100644
--- a/ios/FluffyChat Share/ShareViewController.swift
+++ b/ios/Twake Share/ShareViewController.swift
@@ -5,8 +5,9 @@ import Photos
class ShareViewController: SLComposeServiceViewController {
// TODO: IMPORTANT: This should be your host app bundle identifier
- let hostAppBundleIdentifier = "com.linagora.ios.twake"
+ var hostAppBundleIdentifier = "com.linagora.ios.twake"
let sharedKey = "ShareKey"
+ var appGroupId = ""
var sharedMedia: [SharedMediaFile] = []
var sharedText: [String] = []
let imageContentType = kUTTypeImage as String
@@ -15,12 +16,30 @@ class ShareViewController: SLComposeServiceViewController {
let urlContentType = kUTTypeURL as String
let fileURLType = kUTTypeFileURL as String;
+ private func loadIds() {
+ // loading Share extension App Id
+ let shareExtensionAppBundleIdentifier = Bundle.main.bundleIdentifier!;
+
+
+ // convert ShareExtension id to host app id
+ // By default it is remove last part of id after last point
+ // For example: com.test.ShareExtension -> com.test
+ let lastIndexOfPoint = shareExtensionAppBundleIdentifier.lastIndex(of: ".");
+ hostAppBundleIdentifier = String(shareExtensionAppBundleIdentifier[..
+ appGroupId = (Bundle.main.object(forInfoDictionaryKey: "AppGroupId") as? String) ?? "group.\(hostAppBundleIdentifier)";
+ }
+
override func isContentValid() -> Bool {
return true
}
override func viewDidLoad() {
super.viewDidLoad();
+
+ // load group and app id from build info
+ loadIds();
}
override func viewDidAppear(_ animated: Bool) {
@@ -64,7 +83,7 @@ class ShareViewController: SLComposeServiceViewController {
// If this is the last item, save imagesData in userDefaults and redirect to host app
if index == (content.attachments?.count)! - 1 {
- let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)")
+ let userDefaults = UserDefaults(suiteName: this.appGroupId)
userDefaults?.set(this.sharedText, forKey: this.sharedKey)
userDefaults?.synchronize()
this.redirectToHostApp(type: .text)
@@ -85,7 +104,7 @@ class ShareViewController: SLComposeServiceViewController {
// If this is the last item, save imagesData in userDefaults and redirect to host app
if index == (content.attachments?.count)! - 1 {
- let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)")
+ let userDefaults = UserDefaults(suiteName: this.appGroupId)
userDefaults?.set(this.sharedText, forKey: this.sharedKey)
userDefaults?.synchronize()
this.redirectToHostApp(type: .text)
@@ -98,30 +117,55 @@ class ShareViewController: SLComposeServiceViewController {
}
private func handleImages (content: NSExtensionItem, attachment: NSItemProvider, index: Int) {
+
+ func completed(copied: Bool, newPath: URL) {
+ if(copied) {
+ sharedMedia.append(SharedMediaFile(path: newPath.absoluteString, thumbnail: nil, duration: nil, type: .image))
+ }
+
+ // If this is the last item, save imagesData in userDefaults and redirect to host app
+ if index == (content.attachments?.count ?? 0) - 1 {
+ let userDefaults = UserDefaults(suiteName: "group.\(hostAppBundleIdentifier)")
+ userDefaults?.set(toData(data: sharedMedia), forKey: sharedKey)
+ userDefaults?.synchronize()
+ redirectToHostApp(type: .media)
+ }
+ }
+
attachment.loadItem(forTypeIdentifier: imageContentType, options: nil) { [weak self] data, error in
- if error == nil, let url = data as? URL, let this = self {
-
- // Always copy
- let fileName = this.getFileName(from: url, type: .image)
- let newPath = FileManager.default
- .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")!
- .appendingPathComponent(fileName)
- let copied = this.copyFile(at: url, to: newPath)
- if(copied) {
- this.sharedMedia.append(SharedMediaFile(path: newPath.absoluteString, thumbnail: nil, duration: nil, type: .image))
- }
-
- // If this is the last item, save imagesData in userDefaults and redirect to host app
- if index == (content.attachments?.count)! - 1 {
- let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)")
- userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey)
- userDefaults?.synchronize()
- this.redirectToHostApp(type: .media)
+ guard let this = self else { return }
+
+ if error == nil {
+
+ let groupRootURL = FileManager.default
+ .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")!
+
+ if let url = data as? URL {
+ // Always copy
+ let fileName = this.getFileName(from: url, type: .image)
+ let newPath = groupRootURL.appendingPathComponent(fileName)
+ let copied = this.copyFile(at: url, to: newPath)
+ completed(copied: copied, newPath: newPath)
+ } else if let image = data as? UIImage,
+ let jpegData = image.jpegData(compressionQuality: 1.0) {
+
+ let fileName = "\(Int64(Date().timeIntervalSince1970)).jpg"
+ let newPath = groupRootURL.appendingPathComponent(fileName)
+
+ var copied = false
+ do {
+ try jpegData.write(to: newPath)
+ copied = true
+ } catch {
+ this.dismissWithError()
+ }
+ completed(copied: copied, newPath: newPath)
+ } else {
+ this.dismissWithError()
}
-
} else {
- self?.dismissWithError()
+ this.dismissWithError()
}
}
}
@@ -134,7 +178,7 @@ class ShareViewController: SLComposeServiceViewController {
// Always copy
let fileName = this.getFileName(from: url, type: .video)
let newPath = FileManager.default
- .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")!
+ .containerURL(forSecurityApplicationGroupIdentifier: this.appGroupId)!
.appendingPathComponent(fileName)
let copied = this.copyFile(at: url, to: newPath)
if(copied) {
@@ -146,7 +190,7 @@ class ShareViewController: SLComposeServiceViewController {
// If this is the last item, save imagesData in userDefaults and redirect to host app
if index == (content.attachments?.count)! - 1 {
- let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)")
+ let userDefaults = UserDefaults(suiteName: this.appGroupId)
userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey)
userDefaults?.synchronize()
this.redirectToHostApp(type: .media)
@@ -166,7 +210,7 @@ class ShareViewController: SLComposeServiceViewController {
// Always copy
let fileName = this.getFileName(from :url, type: .file)
let newPath = FileManager.default
- .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")!
+ .containerURL(forSecurityApplicationGroupIdentifier: this.appGroupId)!
.appendingPathComponent(fileName)
let copied = this.copyFile(at: url, to: newPath)
if (copied) {
@@ -174,7 +218,7 @@ class ShareViewController: SLComposeServiceViewController {
}
if index == (content.attachments?.count)! - 1 {
- let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)")
+ let userDefaults = UserDefaults(suiteName: this.appGroupId)
userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey)
userDefaults?.synchronize()
this.redirectToHostApp(type: .file)
@@ -200,6 +244,8 @@ class ShareViewController: SLComposeServiceViewController {
}
private func redirectToHostApp(type: RedirectType) {
+ // ids may not loaded yet so we need loadIds here too
+ loadIds();
let url = URL(string: "ShareMedia-\(hostAppBundleIdentifier)://dataUrl=\(sharedKey)#\(type)")
var responder = self as UIResponder?
let selectorOpenURL = sel_registerName("openURL:")
@@ -291,7 +337,7 @@ class ShareViewController: SLComposeServiceViewController {
private func getThumbnailPath(for url: URL) -> URL {
let fileName = Data(url.lastPathComponent.utf8).base64EncodedString().replacingOccurrences(of: "==", with: "")
let path = FileManager.default
- .containerURL(forSecurityApplicationGroupIdentifier: "group.\(hostAppBundleIdentifier)")!
+ .containerURL(forSecurityApplicationGroupIdentifier: appGroupId)!
.appendingPathComponent("\(fileName).jpg")
return path
}
@@ -332,4 +378,4 @@ extension Array {
subscript (safe index: UInt) -> Element? {
return Int(index) < count ? self[Int(index)] : nil
}
-}
\ No newline at end of file
+}
diff --git a/ios/FluffyChat Share/FluffyChat Share.entitlements b/ios/Twake Share/Twake Share.entitlements
similarity index 100%
rename from ios/FluffyChat Share/FluffyChat Share.entitlements
rename to ios/Twake Share/Twake Share.entitlements
diff --git a/ios/en.lproj/Localizable.strings b/ios/en.lproj/Localizable.strings
deleted file mode 100644
index d8d6570ee6..0000000000
--- a/ios/en.lproj/Localizable.strings
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- Localizable.strings
- Runner
-
- Created by Minh DrMinh on 7/19/23.
-
-*/
-"SINGLE_UNREAD" = "1 unread chat(s)";
diff --git a/lib/config/app_config.dart b/lib/config/app_config.dart
index 5d4e844f01..c696c243d5 100644
--- a/lib/config/app_config.dart
+++ b/lib/config/app_config.dart
@@ -1,7 +1,6 @@
import 'dart:io';
import 'dart:ui';
-import 'package:fluffychat/utils/platform_infos.dart';
import 'package:flutter/foundation.dart';
import 'package:matrix/matrix.dart';
@@ -44,7 +43,6 @@ abstract class AppConfig {
static bool showDirectChatsInSpaces = true;
static bool separateChatTypes = false;
static bool autoplayImages = true;
- static bool sendOnEnter = !PlatformInfos.isMobile;
static bool experimentalVoip = false;
static const bool hideTypingUsernames = false;
static const bool hideAllStateEvents = false;
diff --git a/lib/config/setting_keys.dart b/lib/config/setting_keys.dart
index eeb3a16d64..2dca4a3172 100644
--- a/lib/config/setting_keys.dart
+++ b/lib/config/setting_keys.dart
@@ -26,6 +26,5 @@ abstract class SettingKeys {
static const String dontAskForBootstrapKey =
'chat.fluffychat.dont_ask_bootstrap';
static const String autoplayImages = 'chat.fluffy.autoplay_images';
- static const String sendOnEnter = 'chat.fluffy.send_on_enter';
static const String experimentalVoip = 'chat.fluffy.experimental_voip';
}
diff --git a/lib/di/global/get_it_initializer.dart b/lib/di/global/get_it_initializer.dart
index cc728b5864..21ab9c6ae1 100644
--- a/lib/di/global/get_it_initializer.dart
+++ b/lib/di/global/get_it_initializer.dart
@@ -39,7 +39,6 @@ import 'package:fluffychat/domain/usecase/search/pre_search_recent_contacts_inte
import 'package:fluffychat/domain/usecase/search/search_recent_chat_interactor.dart';
import 'package:fluffychat/domain/usecase/send_file_interactor.dart';
import 'package:fluffychat/domain/usecase/send_file_on_web_interactor.dart';
-import 'package:fluffychat/domain/usecase/send_image_interactor.dart';
import 'package:fluffychat/domain/usecase/send_images_interactor.dart';
import 'package:fluffychat/domain/usecase/settings/update_profile_interactor.dart';
import 'package:fluffychat/event/twake_event_dispatcher.dart';
@@ -141,7 +140,6 @@ class GetItInitializer {
getIt.registerFactory(
() => GetContactsInteractor(),
);
- getIt.registerSingleton(SendImageInteractor());
getIt.registerSingleton(SendImagesInteractor());
getIt.registerSingleton(
DownloadFileForPreviewInteractor(),
diff --git a/lib/domain/model/preview_file/supported_preview_file_types.dart b/lib/domain/model/preview_file/supported_preview_file_types.dart
index 18d280c924..4609d91c2d 100644
--- a/lib/domain/model/preview_file/supported_preview_file_types.dart
+++ b/lib/domain/model/preview_file/supported_preview_file_types.dart
@@ -29,6 +29,8 @@ class SupportedPreviewFileTypes {
static const pdfMimeTypes = ['application/pdf', 'application/rtf'];
+ static const apkMimeTypes = ['application/vnd.android.package-archive'];
+
static const xlsMimeTypes = [
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'application/vnd.oasis.opendocument.spreadsheet',
diff --git a/lib/domain/model/room/room_extension.dart b/lib/domain/model/room/room_extension.dart
index b70f7ef3b5..313b66b4c8 100644
--- a/lib/domain/model/room/room_extension.dart
+++ b/lib/domain/model/room/room_extension.dart
@@ -45,4 +45,16 @@ extension RoomExtension on Room {
Future unmute() async {
await setPushRuleState(PushRuleState.notify);
}
+
+ String storePlaceholderFileInMem({
+ required FileInfo fileInfo,
+ String? txid,
+ }) {
+ txid ??= client.generateUniqueTransactionId();
+ final matrixFile = MatrixFile.fromFileInfo(
+ fileInfo: fileInfo,
+ );
+ sendingFilePlaceholders[txid] = matrixFile;
+ return txid;
+ }
}
diff --git a/lib/domain/usecase/forward/forward_message_interactor.dart b/lib/domain/usecase/forward/forward_message_interactor.dart
index 205e404a5b..e20ef4f7f3 100644
--- a/lib/domain/usecase/forward/forward_message_interactor.dart
+++ b/lib/domain/usecase/forward/forward_message_interactor.dart
@@ -2,6 +2,7 @@ import 'package:dartz/dartz.dart';
import 'package:fluffychat/app_state/failure.dart';
import 'package:fluffychat/app_state/success.dart';
import 'package:fluffychat/domain/app_state/forward/forward_message_state.dart';
+import 'package:fluffychat/event/twake_event_types.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:matrix/matrix.dart';
@@ -37,7 +38,8 @@ class ForwardMessageInteractor {
Room room,
) async* {
final shareFile = message.tryGet('file');
- if (message.tryGet('msgtype') == 'chat.fluffy.shared_file' &&
+ if (message.tryGet('msgtype') ==
+ TwakeEventTypes.shareFileEventType &&
shareFile != null) {
yield Right(
ForwardMessageIsShareFileState(shareFile: shareFile, room: room),
diff --git a/lib/domain/usecase/send_file_interactor.dart b/lib/domain/usecase/send_file_interactor.dart
index 1c4006fedc..ac0291c0d6 100644
--- a/lib/domain/usecase/send_file_interactor.dart
+++ b/lib/domain/usecase/send_file_interactor.dart
@@ -1,4 +1,5 @@
import 'package:fluffychat/data/network/extensions/file_info_extension.dart';
+import 'package:fluffychat/domain/model/room/room_extension.dart';
import 'package:fluffychat/presentation/extensions/send_file_extension.dart';
import 'package:matrix/matrix.dart';
@@ -14,9 +15,8 @@ class SendFileInteractor {
}) async {
try {
for (final fileInfo in fileInfos) {
- final txid = _storePlaceholderFileInMem(
+ final txid = room.storePlaceholderFileInMem(
fileInfo: fileInfo,
- room: room,
);
await room.sendFileEvent(
fileInfo,
@@ -31,18 +31,4 @@ class SendFileInteractor {
Logs().d("SendFileInteractor: execute(): $error");
}
}
-
- String _storePlaceholderFileInMem({
- required Room room,
- required FileInfo fileInfo,
- }) {
- final txid = room.client.generateUniqueTransactionId();
- final matrixFile = MatrixFile.fromMimeType(
- name: fileInfo.fileName,
- filePath: fileInfo.filePath,
- mimeType: fileInfo.mimeType,
- );
- room.sendingFilePlaceholders[txid] = matrixFile;
- return txid;
- }
}
diff --git a/lib/domain/usecase/send_image_interactor.dart b/lib/domain/usecase/send_image_interactor.dart
deleted file mode 100644
index e45b7b7226..0000000000
--- a/lib/domain/usecase/send_image_interactor.dart
+++ /dev/null
@@ -1,30 +0,0 @@
-import 'package:fluffychat/presentation/extensions/send_file_extension.dart';
-import 'package:fluffychat/presentation/model/file/file_asset_entity.dart';
-import 'package:matrix/matrix.dart';
-
-class SendImageInteractor {
- Future execute({
- required Room room,
- required FileAssetEntity entity,
- String? txId,
- Event? inReplyTo,
- String? editEventId,
- int? shrinkImageMaxDimension,
- Map? extraContent,
- }) async {
- final fileInfo = await entity.toFileInfo();
- if (fileInfo != null) {
- try {
- await room.sendFileEvent(
- fileInfo,
- txid: txId,
- editEventId: editEventId,
- inReplyTo: inReplyTo,
- shrinkImageMaxDimension: shrinkImageMaxDimension,
- );
- } catch (error) {
- Logs().d("SendImageInteractor: execute(): $error");
- }
- }
- }
-}
diff --git a/lib/domain/usecase/send_images_interactor.dart b/lib/domain/usecase/send_images_interactor.dart
index ee6c951262..fa8c7a4f3a 100644
--- a/lib/domain/usecase/send_images_interactor.dart
+++ b/lib/domain/usecase/send_images_interactor.dart
@@ -27,7 +27,7 @@ class SendImagesInteractor {
);
}
} catch (error) {
- Logs().d("SendImageInteractor: execute(): $error");
+ Logs().d("SendImagesInteractor: execute(): $error");
}
}
}
diff --git a/lib/event/twake_event_types.dart b/lib/event/twake_event_types.dart
new file mode 100644
index 0000000000..06e74a1415
--- /dev/null
+++ b/lib/event/twake_event_types.dart
@@ -0,0 +1,3 @@
+class TwakeEventTypes {
+ static const String shareFileEventType = 'app.twake.shared.file';
+}
diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart
index b12c3f1057..340dad5c1f 100644
--- a/lib/pages/chat/chat.dart
+++ b/lib/pages/chat/chat.dart
@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:io';
import 'package:adaptive_dialog/adaptive_dialog.dart';
+import 'package:debounce_throttle/debounce_throttle.dart';
import 'package:desktop_drop/desktop_drop.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:emoji_picker_flutter/emoji_picker_flutter.dart';
@@ -22,7 +23,6 @@ import 'package:fluffychat/pages/chat/chat_room_search_mixin.dart';
import 'package:fluffychat/pages/chat/chat_view.dart';
import 'package:fluffychat/pages/chat/context_item_chat_action.dart';
import 'package:fluffychat/pages/chat/dialog_accept_invite_widget.dart';
-import 'package:fluffychat/pages/chat/event_info_dialog.dart';
import 'package:fluffychat/pages/chat/recording_dialog.dart';
import 'package:fluffychat/pages/chat_details/chat_details_actions_enum.dart';
import 'package:fluffychat/presentation/mixins/common_media_picker_mixin.dart';
@@ -31,6 +31,8 @@ import 'package:fluffychat/presentation/mixins/media_picker_mixin.dart';
import 'package:fluffychat/presentation/mixins/send_files_mixin.dart';
import 'package:fluffychat/presentation/model/forward/forward_argument.dart';
import 'package:fluffychat/utils/adaptive_bottom_sheet.dart';
+import 'package:fluffychat/utils/clipboard.dart';
+import 'package:fluffychat/utils/dialog/twake_loading_dialog.dart';
import 'package:fluffychat/utils/extension/build_context_extension.dart';
import 'package:fluffychat/utils/extension/value_notifier_extension.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart';
@@ -47,7 +49,6 @@ import 'package:fluffychat/widgets/mixins/popup_context_menu_action_mixin.dart';
import 'package:fluffychat/widgets/mixins/popup_menu_widget_mixin.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
-import 'package:flutter/services.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
import 'package:future_loading_dialog/future_loading_dialog.dart';
@@ -118,6 +119,9 @@ class ChatController extends State
String? get roomId => widget.roomId;
+ final composerDebouncer =
+ Debouncer(const Duration(milliseconds: 100), initialValue: '');
+
bool get isEmptyChat =>
timeline != null &&
!timeline!.events.any(
@@ -261,7 +265,6 @@ class ChatController extends State
if (!mounted) {
return;
}
- hideKeyboardChatScreen();
hideSearchKeyboardIfNeeded();
setReadMarker();
if (!scrollController.hasClients) return;
@@ -319,7 +322,9 @@ class ChatController extends State
sendFileInteractor.execute(
room: room!,
fileInfos: [
- FileInfo(shareFile!.name, shareFile!.filePath!, shareFile!.size),
+ FileInfo.fromMatrixFile(
+ shareFile!,
+ )
],
);
}
@@ -443,7 +448,7 @@ class ChatController extends State
super.dispose();
}
- TextEditingController sendController = TextEditingController();
+ final TextEditingController sendController = TextEditingController();
void setSendingClient(Client? c) {
// first cancle typing with the old sending client
@@ -489,7 +494,7 @@ class ChatController extends State
// ignore: unawaited_futures
room!.sendTextEvent(
- sendController.text,
+ sendController.text.trim(),
inReplyTo: replyEvent,
editEventId: editEvent?.eventId,
parseCommands: parseCommands,
@@ -521,6 +526,9 @@ class ChatController extends State
void onFileTappedMobile(Event event) async {
final permissionHandler = PermissionHandlerService();
+ if (await permissionHandler.noNeedStoragePermission()) {
+ return _handleDownloadFileForPreviewMobile(event: event);
+ }
final storagePermissionStatus =
await permissionHandler.storagePermissionStatus;
switch (storagePermissionStatus) {
@@ -595,23 +603,16 @@ class ChatController extends State
if (failure is DownloadFileForPreviewFailure) {
TwakeSnackBar.show(context, 'Error: ${failure.exception}');
}
+ TwakeLoadingDialog.hideLoadingDialog(context);
}, (success) {
if (success is DownloadFileForPreviewSuccess) {
_openDownloadedFileForPreview(
downloadFileForPreviewResponse:
success.downloadFileForPreviewResponse,
);
- Navigator.of(context).pop();
+ TwakeLoadingDialog.hideLoadingDialog(context);
} else if (success is DownloadFileForPreviewLoading) {
- showDialog(
- context: context,
- useRootNavigator: false,
- builder: (BuildContext context) {
- return const Center(
- child: CircularProgressIndicator(),
- );
- },
- );
+ TwakeLoadingDialog.showLoadingDialog(context);
}
});
});
@@ -621,6 +622,11 @@ class ChatController extends State
required DownloadFileForPreviewResponse downloadFileForPreviewResponse,
}) async {
final mimeType = downloadFileForPreviewResponse.mimeType;
+ if (Platform.isAndroid &&
+ SupportedPreviewFileTypes.apkMimeTypes.contains(mimeType)) {
+ await Share.shareXFiles([XFile(downloadFileForPreviewResponse.filePath)]);
+ return;
+ }
final openResults = await OpenFile.open(
downloadFileForPreviewResponse.filePath,
type: mimeType,
@@ -777,8 +783,41 @@ class ChatController extends State
return copyString;
}
+ void copySingleEventAction() async {
+ if (selectedEvents.length == 1) {
+ final event = selectedEvents.first;
+ if (event.messageType == MessageTypes.Image && PlatformInfos.isWeb) {
+ final matrixFile = event.getMatrixFile() ??
+ await event.downloadAndDecryptAttachment(
+ getThumbnail: true,
+ );
+ try {
+ if (matrixFile.filePath != null) {
+ await Clipboard.instance.copyImageAsStream(
+ File(matrixFile.filePath!),
+ mimeType: event.mimeType,
+ );
+ } else if (matrixFile.bytes != null) {
+ await Clipboard.instance.copyImageAsBytes(
+ matrixFile.bytes!,
+ mimeType: event.mimeType,
+ );
+ }
+ } catch (e) {
+ TwakeSnackBar.show(context, L10n.of(context)!.copyImageFailed);
+ Logs().e(
+ 'copySingleEventAction(): failed to copy file ${matrixFile.name}',
+ );
+ }
+ } else {
+ copyEventsAction();
+ }
+ }
+ }
+
void copyEventsAction() {
- Clipboard.setData(ClipboardData(text: _getSelectedEventString()));
+ Clipboard.instance.copyText(_getSelectedEventString());
+
showEmojiPickerNotifier.value = false;
setState(() {
selectedEvents.clear();
@@ -1199,8 +1238,8 @@ class ChatController extends State
}
void onInputBarSubmitted(_) async {
- await send();
await Future.delayed(const Duration(milliseconds: 100));
+ await send();
FocusScope.of(context).requestFocus(inputFocus);
}
@@ -1222,7 +1261,7 @@ class ChatController extends State
}
}
- void pinEvent() {
+ void pinEventAction() {
final room = this.room;
if (room == null) return;
final pinnedEventIds = room.pinnedEventIds;
@@ -1234,7 +1273,6 @@ class ChatController extends State
} else {
pinnedEventIds.addAll(selectedEventIds);
}
- clearSelectedEvents();
showFutureLoadingDialog(
context: context,
future: () => room.setPinnedEvents(pinnedEventIds),
@@ -1287,9 +1325,6 @@ class ChatController extends State
bool get isArchived =>
{Membership.leave, Membership.ban}.contains(room?.membership);
- void showEventInfo([Event? event]) =>
- (event ?? selectedEvents.single).showInfoDialog(context);
-
void onPhoneButtonTap() async {
// VoIP required Android SDK 21
if (PlatformInfos.isAndroid) {
@@ -1469,11 +1504,11 @@ class ChatController extends State
break;
case ChatContextMenuActions.copyMessage:
onSelectMessage(event);
- copyEventsAction();
+ copySingleEventAction();
break;
case ChatContextMenuActions.pinMessage:
onSelectMessage(event);
- pinEvent();
+ pinEventAction();
break;
case ChatContextMenuActions.forward:
onSelectMessage(event);
@@ -1545,6 +1580,11 @@ class ChatController extends State
}
}
+ void actionWithClearSelections(Function action) {
+ action();
+ clearSelectedEvents();
+ }
+
@override
Widget build(BuildContext context) {
return ChatView(this, key: widget.key);
diff --git a/lib/pages/chat/chat_app_bar_title.dart b/lib/pages/chat/chat_app_bar_title.dart
index ee6fe20494..2fc56377fb 100644
--- a/lib/pages/chat/chat_app_bar_title.dart
+++ b/lib/pages/chat/chat_app_bar_title.dart
@@ -1,5 +1,6 @@
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:fluffychat/pages/chat/chat_app_bar_title_style.dart';
+import 'package:fluffychat/utils/common_helper.dart';
import 'package:fluffychat/utils/room_status_extension.dart';
import 'package:fluffychat/utils/string_extension.dart';
import 'package:flutter/material.dart';
@@ -10,6 +11,7 @@ import 'package:fluffychat/pages/user_bottom_sheet/user_bottom_sheet.dart';
import 'package:fluffychat/utils/adaptive_bottom_sheet.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/widgets/avatar/avatar.dart';
+import 'package:rxdart/rxdart.dart';
class ChatAppBarTitle extends StatelessWidget {
final Widget? actions;
@@ -17,7 +19,7 @@ class ChatAppBarTitle extends StatelessWidget {
final List selectedEvents;
final bool isArchived;
final TextEditingController sendController;
- final Stream getStreamInstance;
+ final Stream connectivityResultStream;
final VoidCallback onPushDetails;
final String? roomName;
@@ -29,7 +31,7 @@ class ChatAppBarTitle extends StatelessWidget {
required this.selectedEvents,
required this.isArchived,
required this.sendController,
- required this.getStreamInstance,
+ required this.connectivityResultStream,
required this.onPushDetails,
}) : super(key: key);
@@ -98,7 +100,10 @@ class ChatAppBarTitle extends StatelessWidget {
overflow: TextOverflow.ellipsis,
style: ChatAppBarTitleStyle.appBarTitleStyle(context),
),
- _buildStatusContent(context, room!),
+ _ChatAppBarStatusContent(
+ connectivityResultStream: connectivityResultStream,
+ room: room!,
+ ),
],
),
),
@@ -106,62 +111,182 @@ class ChatAppBarTitle extends StatelessWidget {
),
);
}
+}
- StreamBuilder _buildStatusContent(
- BuildContext context,
- Room room,
- ) {
- final TextStyle? statusTextStyle =
- ChatAppBarTitleStyle.statusTextStyle(context);
+class _ChatAppBarStatusContent extends StatelessWidget {
+ const _ChatAppBarStatusContent({
+ required this.connectivityResultStream,
+ required this.room,
+ });
+
+ final Stream connectivityResultStream;
+ final Room room;
+
+ @override
+ Widget build(BuildContext context) {
+ if (room.isDirectChat) {
+ return _DirectChatAppBarStatusContent(
+ connectivityResultStream: connectivityResultStream,
+ room: room,
+ );
+ }
+
+ return _GroupChatAppBarStatusContent(
+ connectivityResultStream: connectivityResultStream,
+ room: room,
+ );
+ }
+}
+
+class _DirectChatAppBarStatusContent extends StatelessWidget {
+ const _DirectChatAppBarStatusContent({
+ required this.connectivityResultStream,
+ required this.room,
+ });
+
+ final Stream connectivityResultStream;
+ final Room room;
+
+ @override
+ Widget build(BuildContext context) {
+ CachedPresence? directChatPresence = room.directChatPresence;
+ return FutureBuilder(
+ future: room.client.getPresence(room.directChatMatrixID!),
+ builder: (context, futureSnapshot) {
+ if (futureSnapshot.hasData) {
+ directChatPresence = CachedPresence.fromPresenceResponse(
+ futureSnapshot.data!,
+ room.directChatMatrixID!,
+ );
+ }
+ return StreamBuilder(
+ stream: CombineLatestStream.list(
+ [connectivityResultStream, room.directChatPresenceStream],
+ ),
+ builder: (context, snapshot) {
+ final connectivityResult = tryCast(
+ snapshot.data?[0],
+ fallback: ConnectivityResult.none,
+ );
+ directChatPresence = tryCast(
+ snapshot.data?[1],
+ fallback: directChatPresence,
+ );
+ if (snapshot.hasData &&
+ connectivityResult == ConnectivityResult.none) {
+ return _ChatAppBarTitleText(text: L10n.of(context)!.noConnection);
+ }
+ final typingText = room.getLocalizedTypingText(context);
+ if (typingText.isEmpty) {
+ return _ChatAppBarTitleText(
+ text: room
+ .getLocalizedStatus(context, presence: directChatPresence)
+ .capitalize(context),
+ );
+ } else {
+ return _ChatAppBarTitleTyping(typingText: typingText);
+ }
+ },
+ );
+ },
+ );
+ }
+}
+
+class _GroupChatAppBarStatusContent extends StatelessWidget {
+ const _GroupChatAppBarStatusContent({
+ required this.connectivityResultStream,
+ required this.room,
+ });
+
+ final Stream connectivityResultStream;
+ final Room room;
+
+ @override
+ Widget build(BuildContext context) {
return StreamBuilder(
- stream: getStreamInstance,
+ stream: connectivityResultStream,
builder: (context, snapshot) {
- if (snapshot.hasData && snapshot.data == ConnectivityResult.none) {
- return Text(
- L10n.of(context)!.noConnection,
- maxLines: 1,
- overflow: TextOverflow.ellipsis,
- style: statusTextStyle,
- );
+ final connectivityResult = tryCast(
+ snapshot.data,
+ fallback: ConnectivityResult.none,
+ );
+
+ if (snapshot.hasData && connectivityResult == ConnectivityResult.none) {
+ return _ChatAppBarTitleText(text: L10n.of(context)!.noConnection);
}
final typingText = room.getLocalizedTypingText(context);
if (typingText.isEmpty) {
- return Text(
- room.getLocalizedStatus(context).capitalize(context),
- maxLines: 1,
- overflow: TextOverflow.ellipsis,
- style: statusTextStyle,
+ return _ChatAppBarTitleText(
+ text: room.getLocalizedStatus(context).capitalize(context),
);
} else {
- return IntrinsicWidth(
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.end,
- children: [
- Expanded(
- child: Text(
- typingText,
- maxLines: 1,
- overflow: TextOverflow.clip,
- style: statusTextStyle,
- ),
- ),
- SizedBox(
- width: 32,
- height: 16,
- child: Transform.translate(
- offset: const Offset(0, -2),
- child: LottieBuilder.asset(
- 'assets/typing-indicator.zip',
- fit: BoxFit.fitWidth,
- width: 32,
- ),
- ),
- ),
- ],
- ),
- );
+ return _ChatAppBarTitleTyping(typingText: typingText);
}
},
);
}
}
+
+class _ChatAppBarTitleText extends StatelessWidget {
+ const _ChatAppBarTitleText({
+ required this.text,
+ });
+
+ final String text;
+
+ @override
+ Widget build(BuildContext context) {
+ final TextStyle? statusTextStyle =
+ ChatAppBarTitleStyle.statusTextStyle(context);
+
+ return Text(
+ text,
+ maxLines: 1,
+ overflow: TextOverflow.ellipsis,
+ style: statusTextStyle,
+ );
+ }
+}
+
+class _ChatAppBarTitleTyping extends StatelessWidget {
+ const _ChatAppBarTitleTyping({
+ required this.typingText,
+ });
+
+ final String typingText;
+
+ @override
+ Widget build(BuildContext context) {
+ final TextStyle? statusTextStyle =
+ ChatAppBarTitleStyle.statusTextStyle(context);
+
+ return IntrinsicWidth(
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ children: [
+ Expanded(
+ child: Text(
+ typingText,
+ maxLines: 1,
+ overflow: TextOverflow.clip,
+ style: statusTextStyle,
+ ),
+ ),
+ SizedBox(
+ width: 32,
+ height: 16,
+ child: Transform.translate(
+ offset: const Offset(0, -2),
+ child: LottieBuilder.asset(
+ 'assets/typing-indicator.zip',
+ fit: BoxFit.fitWidth,
+ width: 32,
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/pages/chat/chat_context_menu_actions.dart b/lib/pages/chat/chat_context_menu_actions.dart
index cffc1e5d27..ae62a960ca 100644
--- a/lib/pages/chat/chat_context_menu_actions.dart
+++ b/lib/pages/chat/chat_context_menu_actions.dart
@@ -19,7 +19,7 @@ enum ChatContextMenuActions {
case ChatContextMenuActions.forward:
return L10n.of(context)!.forward;
case ChatContextMenuActions.downloadFile:
- return L10n.of(context)!.downloadFile;
+ return L10n.of(context)!.download;
}
}
diff --git a/lib/pages/chat/chat_event_list.dart b/lib/pages/chat/chat_event_list.dart
index 54c46182e0..a4d848a99b 100644
--- a/lib/pages/chat/chat_event_list.dart
+++ b/lib/pages/chat/chat_event_list.dart
@@ -1,5 +1,6 @@
import 'package:fluffychat/pages/chat/group_chat_empty_view.dart';
import 'package:fluffychat/pages/chat_draft/draft_chat_empty_view.dart';
+import 'package:fluffychat/utils/platform_infos.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
@@ -59,7 +60,9 @@ class ChatEventList extends StatelessWidget {
),
reverse: true,
controller: controller.scrollController,
- keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
+ keyboardDismissBehavior: PlatformInfos.isMobile
+ ? ScrollViewKeyboardDismissBehavior.manual
+ : ScrollViewKeyboardDismissBehavior.onDrag,
childrenDelegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
// Footer to display typing indicator and read receipts:
@@ -105,7 +108,6 @@ class ChatEventList extends StatelessWidget {
event,
onSwipe: (direction) =>
controller.replyAction(replyTo: event),
- onInfoTab: controller.showEventInfo,
onAvatarTab: (Event event) => showAdaptiveBottomSheet(
context: context,
builder: (c) => UserBottomSheet(
diff --git a/lib/pages/chat/chat_input_row.dart b/lib/pages/chat/chat_input_row.dart
index cdb2731d3e..87da3019cd 100644
--- a/lib/pages/chat/chat_input_row.dart
+++ b/lib/pages/chat/chat_input_row.dart
@@ -1,4 +1,3 @@
-import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pages/chat/chat_input_row_mobile.dart';
import 'package:fluffychat/pages/chat/chat_input_row_style.dart';
import 'package:fluffychat/pages/chat/chat_input_row_web.dart';
@@ -13,7 +12,7 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:matrix/matrix.dart';
import 'chat.dart';
-import 'input_bar.dart';
+import 'input_bar/input_bar.dart';
class ChatInputRow extends StatelessWidget {
final ChatController controller;
@@ -156,7 +155,7 @@ class ChatInputRow extends StatelessWidget {
maxLines: 8,
autofocus: !PlatformInfos.isMobile,
keyboardType: TextInputType.multiline,
- textInputAction: AppConfig.sendOnEnter ? TextInputAction.send : null,
+ textInputAction: null,
onSubmitted: controller.onInputBarSubmitted,
focusNode: controller.inputFocus,
keyboardFocusNode: controller.keyboardFocus,
diff --git a/lib/pages/chat/chat_input_row_mobile.dart b/lib/pages/chat/chat_input_row_mobile.dart
index 50d44e58bf..40d3166f26 100644
--- a/lib/pages/chat/chat_input_row_mobile.dart
+++ b/lib/pages/chat/chat_input_row_mobile.dart
@@ -1,6 +1,6 @@
import 'package:animations/animations.dart';
import 'package:fluffychat/pages/chat/chat_input_row_style.dart';
-import 'package:fluffychat/pages/chat/input_bar.dart';
+import 'package:fluffychat/pages/chat/input_bar/input_bar.dart';
import 'package:fluffychat/widgets/twake_components/twake_icon_button.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
diff --git a/lib/pages/chat/chat_input_row_web.dart b/lib/pages/chat/chat_input_row_web.dart
index 6fdda0c808..136e80b7a0 100644
--- a/lib/pages/chat/chat_input_row_web.dart
+++ b/lib/pages/chat/chat_input_row_web.dart
@@ -1,6 +1,6 @@
import 'package:animations/animations.dart';
import 'package:fluffychat/pages/chat/chat_input_row_style.dart';
-import 'package:fluffychat/pages/chat/input_bar.dart';
+import 'package:fluffychat/pages/chat/input_bar/input_bar.dart';
import 'package:fluffychat/widgets/twake_components/twake_icon_button.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart
index e84b126f2e..0ef3a694a0 100644
--- a/lib/pages/chat/chat_view.dart
+++ b/lib/pages/chat/chat_view.dart
@@ -6,6 +6,7 @@ import 'package:fluffychat/pages/chat/chat_event_list.dart';
import 'package:fluffychat/pages/chat/chat_loading_view.dart';
import 'package:fluffychat/pages/chat/chat_search_bottom_view.dart';
import 'package:fluffychat/pages/chat/chat_view_style.dart';
+import 'package:fluffychat/pages/chat/events/message_content_mixin.dart';
import 'package:fluffychat/pages/chat/pinned_events.dart';
import 'package:fluffychat/pages/chat/reply_display.dart';
import 'package:fluffychat/pages/chat/tombstone_display.dart';
@@ -24,7 +25,7 @@ enum _EventContextAction { info, report }
enum _RoomContextAction { search }
-class ChatView extends StatelessWidget {
+class ChatView extends StatelessWidget with MessageContentMixin {
final ChatController controller;
const ChatView(this.controller, {Key? key}) : super(key: key);
@@ -37,29 +38,39 @@ class ChatView extends StatelessWidget {
TwakeIconButton(
icon: Icons.copy_outlined,
tooltip: L10n.of(context)!.copy,
- onTap: controller.copyEventsAction,
+ onTap: () => controller
+ .actionWithClearSelections(controller.copySingleEventAction),
),
- if (controller.canRedactSelectedEvents)
- TwakeIconButton(
- icon: Icons.delete_outlined,
- tooltip: L10n.of(context)!.redactMessage,
- onTap: controller.redactEventsAction,
- ),
+ // #777 Hide Delete Message functionality
+ // if (controller.canRedactSelectedEvents)
+ // TwakeIconButton(
+ // icon: Icons.delete_outlined,
+ // tooltip: L10n.of(context)!.redactMessage,
+ // onTap: () => controller
+ // .actionWithClearSelections(controller.redactEventsAction),
+ // ),
TwakeIconButton(
icon: Icons.push_pin_outlined,
- onTap: controller.pinEvent,
tooltip: L10n.of(context)!.pinMessage,
+ onTap: () =>
+ controller.actionWithClearSelections(controller.pinEventAction),
),
if (controller.selectedEvents.length == 1)
PopupMenuButton<_EventContextAction>(
onSelected: (action) {
switch (action) {
case _EventContextAction.info:
- controller.showEventInfo();
- controller.clearSelectedEvents();
+ controller.actionWithClearSelections(
+ () => showEventInfo(
+ context,
+ controller.selectedEvents.single,
+ ),
+ );
break;
case _EventContextAction.report:
- controller.reportEventAction();
+ controller.actionWithClearSelections(
+ controller.reportEventAction,
+ );
break;
}
},
@@ -174,7 +185,7 @@ class ChatView extends StatelessWidget {
room: controller.room,
isArchived: controller.isArchived,
sendController: controller.sendController,
- getStreamInstance: controller
+ connectivityResultStream: controller
.networkConnectionService
.getStreamInstance(),
actions: _appBarActions(context),
@@ -206,7 +217,8 @@ class ChatView extends StatelessWidget {
valueListenable: controller.showScrollDownButtonNotifier,
builder: (context, showScrollDownButton, _) {
if (showScrollDownButton &&
- controller.selectedEvents.isEmpty) {
+ controller.selectedEvents.isEmpty &&
+ controller.replyEvent == null) {
return Padding(
padding: const EdgeInsets.only(bottom: 56.0),
child: FloatingActionButton(
diff --git a/lib/pages/chat/events/button_content.dart b/lib/pages/chat/events/button_content.dart
new file mode 100644
index 0000000000..33dd298dcd
--- /dev/null
+++ b/lib/pages/chat/events/button_content.dart
@@ -0,0 +1,61 @@
+import 'package:fluffychat/pages/chat/events/button_content_style.dart';
+import 'package:flutter/material.dart';
+
+class ButtonContent extends StatelessWidget {
+ final Function onTap;
+ final IconData icon;
+ final String title;
+
+ const ButtonContent({
+ Key? key,
+ required this.onTap,
+ required this.icon,
+ required this.title,
+ }) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return Padding(
+ padding: ButtonContentStyle.parentPadding,
+ child: InkWell(
+ onTap: () => onTap,
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ crossAxisAlignment: CrossAxisAlignment.center,
+ children: [
+ Container(
+ decoration: BoxDecoration(
+ color: Theme.of(context).colorScheme.onError,
+ shape: BoxShape.circle,
+ ),
+ padding: ButtonContentStyle.leadingIconPadding,
+ child: Icon(
+ icon,
+ color: Theme.of(context).colorScheme.primary,
+ size: ButtonContentStyle.leadingIconSize,
+ ),
+ ),
+ const SizedBox(width: ButtonContentStyle.leadingAndTextGap),
+ Container(
+ constraints: const BoxConstraints(
+ maxWidth: ButtonContentStyle.textMaxWidth,
+ ),
+ child: Text(
+ title,
+ maxLines: 2,
+ overflow: TextOverflow.ellipsis,
+ style: Theme.of(context).textTheme.bodyMedium!.copyWith(
+ color: Theme.of(context).colorScheme.onSurface,
+ ),
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/pages/chat/events/encrypted_content_style.dart b/lib/pages/chat/events/button_content_style.dart
similarity index 66%
rename from lib/pages/chat/events/encrypted_content_style.dart
rename to lib/pages/chat/events/button_content_style.dart
index cbde22376f..44c6ae8639 100644
--- a/lib/pages/chat/events/encrypted_content_style.dart
+++ b/lib/pages/chat/events/button_content_style.dart
@@ -1,8 +1,9 @@
import 'package:flutter/material.dart';
-class EncryptedContentStyle {
- static const EdgeInsets parentPadding = EdgeInsets.symmetric(
- horizontal: 8,
+class ButtonContentStyle {
+ static const EdgeInsets parentPadding = EdgeInsets.only(
+ left: 2,
+ right: 8,
);
static const EdgeInsets leadingIconPadding = EdgeInsets.all(5);
static const double leadingIconSize = 20;
diff --git a/lib/pages/chat/events/call_invite_content.dart b/lib/pages/chat/events/call_invite_content.dart
new file mode 100644
index 0000000000..3ef73870f1
--- /dev/null
+++ b/lib/pages/chat/events/call_invite_content.dart
@@ -0,0 +1,28 @@
+import 'package:fluffychat/pages/chat/events/button_content.dart';
+import 'package:fluffychat/pages/chat/events/message_content_mixin.dart';
+import 'package:flutter/material.dart';
+import 'package:matrix/matrix.dart';
+import 'package:flutter_gen/gen_l10n/l10n.dart';
+
+class CallInviteContent extends StatelessWidget with MessageContentMixin {
+ final Event event;
+
+ const CallInviteContent({Key? key, required this.event}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return FutureBuilder(
+ future: event.fetchSenderUser(),
+ builder: (context, snapshot) {
+ return ButtonContent(
+ title: L10n.of(context)!.startedACall(
+ snapshot.data?.calcDisplayname() ??
+ event.senderFromMemoryOrFallback.calcDisplayname(),
+ ),
+ icon: Icons.phone_outlined,
+ onTap: () => showEventInfo(context, event),
+ );
+ },
+ );
+ }
+}
diff --git a/lib/pages/chat/events/encrypted_content.dart b/lib/pages/chat/events/encrypted_content.dart
index dd8dfbaa3c..f8c636ccb3 100644
--- a/lib/pages/chat/events/encrypted_content.dart
+++ b/lib/pages/chat/events/encrypted_content.dart
@@ -1,4 +1,4 @@
-import 'package:fluffychat/pages/chat/events/encrypted_content_style.dart';
+import 'package:fluffychat/pages/chat/events/button_content.dart';
import 'package:fluffychat/pages/chat/events/encrypted_mixin.dart';
import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart';
@@ -11,46 +11,10 @@ class EncryptedContent extends StatelessWidget with EncryptedMixin {
@override
Widget build(BuildContext context) {
- return Padding(
- padding: EncryptedContentStyle.parentPadding,
- child: InkWell(
- onTap: () => verifyOrRequestKey(context, event),
- child: Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Container(
- decoration: BoxDecoration(
- color: Theme.of(context).colorScheme.onError,
- shape: BoxShape.circle,
- ),
- padding: EncryptedContentStyle.leadingIconPadding,
- child: Icon(
- Icons.lock,
- color: Theme.of(context).colorScheme.primary,
- size: EncryptedContentStyle.leadingIconSize,
- ),
- ),
- const SizedBox(width: EncryptedContentStyle.leadingAndTextGap),
- Container(
- constraints: const BoxConstraints(
- maxWidth: EncryptedContentStyle.textMaxWidth,
- ),
- child: Text(
- maxLines: 2,
- L10n.of(context)!.thisMessageHasBeenEncrypted,
- style: Theme.of(context).textTheme.bodyMedium!.copyWith(
- color: Theme.of(context).colorScheme.onSurface,
- ),
- ),
- ),
- ],
- ),
- ],
- ),
- ),
+ return ButtonContent(
+ onTap: () => verifyOrRequestKey(context, event),
+ icon: Icons.lock,
+ title: L10n.of(context)!.thisMessageHasBeenEncrypted,
);
}
}
diff --git a/lib/pages/chat/events/message/message.dart b/lib/pages/chat/events/message/message.dart
index 49184d1d8a..a674954f96 100644
--- a/lib/pages/chat/events/message/message.dart
+++ b/lib/pages/chat/events/message/message.dart
@@ -31,7 +31,6 @@ class Message extends StatelessWidget {
final Event? nextEvent;
final void Function(Event)? onSelect;
final void Function(Event)? onAvatarTab;
- final void Function(Event)? onInfoTab;
final void Function(String)? scrollToEventId;
final void Function(SwipeDirection) onSwipe;
final void Function(bool, Event)? onHover;
@@ -49,7 +48,6 @@ class Message extends StatelessWidget {
this.nextEvent,
this.longPressSelect = false,
this.onSelect,
- this.onInfoTab,
this.onAvatarTab,
this.onHover,
this.scrollToEventId,
@@ -344,8 +342,6 @@ class Message extends StatelessWidget {
displayEvent,
textColor:
textColor,
- onInfoTab:
- onInfoTab,
endOfBubbleWidget:
Padding(
padding:
diff --git a/lib/pages/chat/events/message_content.dart b/lib/pages/chat/events/message_content.dart
index c87288ee85..913db51949 100644
--- a/lib/pages/chat/events/message_content.dart
+++ b/lib/pages/chat/events/message_content.dart
@@ -2,10 +2,13 @@ import 'package:fluffychat/app_state/success.dart';
import 'package:fluffychat/domain/app_state/room/chat_room_search_state.dart';
import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/config/app_config.dart';
+import 'package:fluffychat/pages/chat/events/call_invite_content.dart';
import 'package:fluffychat/pages/chat/events/encrypted_content.dart';
import 'package:fluffychat/pages/chat/events/message_content_style.dart';
+import 'package:fluffychat/pages/chat/events/redacted_content.dart';
import 'package:fluffychat/pages/chat/events/sending_image_info_widget.dart';
import 'package:fluffychat/pages/chat/events/sending_video_widget.dart';
+import 'package:fluffychat/pages/chat/events/unknown_content.dart';
import 'package:fluffychat/presentation/mixins/play_video_action_mixin.dart';
import 'package:fluffychat/presentation/model/file/display_image_info.dart';
import 'package:fluffychat/utils/extension/image_size_extension.dart';
@@ -22,7 +25,6 @@ import 'package:matrix/matrix.dart' hide Visibility;
import 'package:fluffychat/pages/chat/events/event_video_player.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart';
-import 'package:fluffychat/widgets/matrix.dart';
import 'audio_player.dart';
import 'cute_events.dart';
import 'html_message.dart';
@@ -34,7 +36,6 @@ import 'sticker.dart';
class MessageContent extends StatelessWidget with PlayVideoActionMixin {
final Event event;
final Color textColor;
- final void Function(Event)? onInfoTab;
final Widget endOfBubbleWidget;
final Color backgroundColor;
final void Function()? onTapPreview;
@@ -44,7 +45,6 @@ class MessageContent extends StatelessWidget with PlayVideoActionMixin {
const MessageContent(
this.event, {
- this.onInfoTab,
Key? key,
required this.controller,
required this.textColor,
@@ -58,8 +58,6 @@ class MessageContent extends StatelessWidget with PlayVideoActionMixin {
@override
Widget build(BuildContext context) {
final fontSize = AppConfig.messageFontSize * AppConfig.fontSizeFactor;
- final buttonTextColor =
- event.senderId == Matrix.of(context).client.userID ? textColor : null;
switch (event.type) {
case EventTypes.Encrypted:
return EncryptedContent(event: event);
@@ -220,25 +218,9 @@ class MessageContent extends StatelessWidget with PlayVideoActionMixin {
textmessage:
default:
if (event.redacted) {
- return FutureBuilder(
- future: event.redactedBecause?.fetchSenderUser(),
- builder: (context, snapshot) {
- return _ButtonContent(
- label: L10n.of(context)!.redactedAnEvent(
- snapshot.data?.calcDisplayname() ??
- event.senderFromMemoryOrFallback.calcDisplayname(),
- ),
- icon: const Icon(Icons.delete_outlined),
- textColor: buttonTextColor,
- onPressed: () => onInfoTab!(event),
- );
- },
- );
+ return RedactedContent(event: event);
}
- final bigEmotes = event.onlyEmotes &&
- event.numberEmotes > 0 &&
- event.numberEmotes <= 10;
return FutureBuilder(
future: event.calcLocalizedBody(
MatrixLocals(L10n.of(context)!),
@@ -263,11 +245,10 @@ class MessageContent extends StatelessWidget with PlayVideoActionMixin {
Theme.of(context).textTheme.bodyLarge?.copyWith(
color: Theme.of(context).colorScheme.onSurface,
),
- linkStyle: TextStyle(
- color: Theme.of(context).colorScheme.secondary,
- fontSize: bigEmotes ? fontSize * 3 : fontSize,
- decorationColor: textColor.withAlpha(150),
- ),
+ linkStyle:
+ Theme.of(context).textTheme.bodyLarge?.copyWith(
+ color: Theme.of(context).colorScheme.secondary,
+ ),
childWidget: Visibility(
visible: false,
maintainSize: true,
@@ -297,68 +278,13 @@ class MessageContent extends StatelessWidget with PlayVideoActionMixin {
);
}
case EventTypes.CallInvite:
- return FutureBuilder(
- future: event.fetchSenderUser(),
- builder: (context, snapshot) {
- return _ButtonContent(
- label: L10n.of(context)!.startedACall(
- snapshot.data?.calcDisplayname() ??
- event.senderFromMemoryOrFallback.calcDisplayname(),
- ),
- icon: const Icon(Icons.phone_outlined),
- textColor: buttonTextColor,
- onPressed: () => onInfoTab!(event),
- );
- },
- );
+ return CallInviteContent(event: event);
default:
- return FutureBuilder(
- future: event.fetchSenderUser(),
- builder: (context, snapshot) {
- return _ButtonContent(
- label: L10n.of(context)!.userSentUnknownEvent(
- snapshot.data?.calcDisplayname() ??
- event.senderFromMemoryOrFallback.calcDisplayname(),
- event.type,
- ),
- icon: const Icon(Icons.info_outlined),
- textColor: buttonTextColor,
- onPressed: () => onInfoTab!(event),
- );
- },
- );
+ return UnknownContent(event: event);
}
}
}
-class _ButtonContent extends StatelessWidget {
- final void Function() onPressed;
- final String label;
- final Icon icon;
- final Color? textColor;
-
- const _ButtonContent({
- required this.label,
- required this.icon,
- required this.textColor,
- required this.onPressed,
- Key? key,
- }) : super(key: key);
-
- @override
- Widget build(BuildContext context) {
- return OutlinedButton.icon(
- onPressed: onPressed,
- icon: icon,
- label: Text(label, overflow: TextOverflow.ellipsis),
- style: OutlinedButton.styleFrom(
- foregroundColor: textColor,
- backgroundColor: MessageContentStyle.backgroundColorButton,
- ),
- );
- }
-}
-
class _MessageImageBuilder extends StatelessWidget {
final Event event;
@@ -386,6 +312,7 @@ class _MessageImageBuilder extends StatelessWidget {
file.height?.toDouble() ?? MessageContentStyle.imageHeight(context),
).getDisplayImageInfo(context);
return SendingImageInfoWidget(
+ key: ValueKey(event.eventId),
matrixFile: file,
event: event,
onTapPreview: onTapPreview,
@@ -457,10 +384,12 @@ class _MessageVideoBuilder extends StatelessWidget {
}
if (isSendingVideo(matrixFile)) {
final file = matrixFile as MatrixVideoFile;
- displayImageInfo = Size(
- file.width!.toDouble(),
- file.height!.toDouble(),
- ).getDisplayImageInfo(context);
+ if (file.width != null && file.height != null) {
+ displayImageInfo = Size(
+ file.width!.toDouble(),
+ file.height!.toDouble(),
+ ).getDisplayImageInfo(context);
+ }
return SendingVideoWidget(
key: ValueKey(event.eventId),
event: event,
@@ -483,8 +412,6 @@ class _MessageVideoBuilder extends StatelessWidget {
}
bool isSendingVideo(MatrixFile? matrixFile) {
- return matrixFile is MatrixVideoFile &&
- matrixFile.width != null &&
- matrixFile.height != null;
+ return matrixFile is MatrixVideoFile && matrixFile.bytes != null;
}
}
diff --git a/lib/pages/chat/events/message_content_mixin.dart b/lib/pages/chat/events/message_content_mixin.dart
new file mode 100644
index 0000000000..2e0ed86d82
--- /dev/null
+++ b/lib/pages/chat/events/message_content_mixin.dart
@@ -0,0 +1,8 @@
+import 'package:fluffychat/pages/chat/event_info_dialog.dart';
+import 'package:flutter/material.dart';
+import 'package:matrix/matrix.dart';
+
+mixin MessageContentMixin {
+ void showEventInfo(BuildContext context, Event event) =>
+ event.showInfoDialog(context);
+}
diff --git a/lib/pages/chat/events/redacted_content.dart b/lib/pages/chat/events/redacted_content.dart
new file mode 100644
index 0000000000..635665c537
--- /dev/null
+++ b/lib/pages/chat/events/redacted_content.dart
@@ -0,0 +1,25 @@
+import 'package:fluffychat/pages/chat/events/button_content.dart';
+import 'package:fluffychat/pages/chat/events/message_content_mixin.dart';
+import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart';
+import 'package:flutter/material.dart';
+import 'package:matrix/matrix.dart';
+import 'package:flutter_gen/gen_l10n/l10n.dart';
+
+class RedactedContent extends StatelessWidget with MessageContentMixin {
+ final Event event;
+
+ const RedactedContent({Key? key, required this.event}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return ButtonContent(
+ title: event.calcLocalizedBodyFallback(
+ MatrixLocals(L10n.of(context)!),
+ withSenderNamePrefix: false,
+ hideReply: true,
+ ),
+ icon: Icons.delete_outlined,
+ onTap: () => showEventInfo(context, event),
+ );
+ }
+}
diff --git a/lib/pages/chat/events/unknown_content.dart b/lib/pages/chat/events/unknown_content.dart
new file mode 100644
index 0000000000..8f0c6f0971
--- /dev/null
+++ b/lib/pages/chat/events/unknown_content.dart
@@ -0,0 +1,29 @@
+import 'package:fluffychat/pages/chat/events/button_content.dart';
+import 'package:fluffychat/pages/chat/events/message_content_mixin.dart';
+import 'package:flutter/material.dart';
+import 'package:matrix/matrix.dart';
+import 'package:flutter_gen/gen_l10n/l10n.dart';
+
+class UnknownContent extends StatelessWidget with MessageContentMixin {
+ final Event event;
+
+ const UnknownContent({Key? key, required this.event}) : super(key: key);
+
+ @override
+ Widget build(BuildContext context) {
+ return FutureBuilder(
+ future: event.fetchSenderUser(),
+ builder: (context, snapshot) {
+ return ButtonContent(
+ title: L10n.of(context)!.userSentUnknownEvent(
+ snapshot.data?.calcDisplayname() ??
+ event.senderFromMemoryOrFallback.calcDisplayname(),
+ event.type,
+ ),
+ icon: Icons.info_outlined,
+ onTap: () => showEventInfo(context, event),
+ );
+ },
+ );
+ }
+}
diff --git a/lib/pages/chat/input_bar/context_menu_input_bar.dart b/lib/pages/chat/input_bar/context_menu_input_bar.dart
new file mode 100644
index 0000000000..ace4e0c3cd
--- /dev/null
+++ b/lib/pages/chat/input_bar/context_menu_input_bar.dart
@@ -0,0 +1,82 @@
+import 'package:fluffychat/presentation/enum/chat/popup_menu_item_web_enum.dart';
+import 'package:fluffychat/utils/platform_infos.dart';
+import 'package:flutter/gestures.dart';
+import 'package:flutter/material.dart';
+import 'package:fluffychat/presentation/extensions/text_editting_controller_extension.dart';
+import 'package:flutter_gen/gen_l10n/l10n.dart';
+import 'package:matrix/matrix.dart';
+
+class ContextMenuInputBar extends StatelessWidget {
+ final Widget child;
+
+ final TextEditingController? controller;
+
+ final VoidCallback handlePaste;
+
+ final Room? room;
+
+ const ContextMenuInputBar({
+ super.key,
+ required this.child,
+ required this.handlePaste,
+ this.controller,
+ this.room,
+ });
+
+ @override
+ Widget build(BuildContext context) {
+ return Listener(
+ onPointerDown: (PointerDownEvent event) async {
+ if (event.kind == PointerDeviceKind.mouse &&
+ event.buttons == kSecondaryMouseButton) {
+ // FIXME: the contextMenuBuilder.editable can do this but its style in web is not customizable
+ // currently this is only solution
+ final screenSize = MediaQuery.of(context).size;
+ final offset = event.position;
+ final position = RelativeRect.fromLTRB(
+ offset.dx,
+ offset.dy,
+ screenSize.width - offset.dx,
+ screenSize.height - offset.dy,
+ );
+ final menuItem = await showMenu(
+ useRootNavigator: PlatformInfos.isWeb,
+ context: context,
+ items: [
+ PopupMenuItem(
+ value: InputBarContextMenu.copy,
+ child: Text(L10n.of(context)!.copy),
+ ),
+ PopupMenuItem(
+ value: InputBarContextMenu.cut,
+ child: Text(L10n.of(context)!.cut),
+ ),
+ PopupMenuItem(
+ value: InputBarContextMenu.paste,
+ child: Text(L10n.of(context)!.paste),
+ ),
+ ],
+ position: position,
+ );
+
+ if (menuItem == null || controller == null) {
+ return;
+ }
+
+ switch (menuItem) {
+ case InputBarContextMenu.copy:
+ controller!.copyText();
+ break;
+ case InputBarContextMenu.cut:
+ controller!.cutText();
+ break;
+ case InputBarContextMenu.paste:
+ handlePaste();
+ break;
+ }
+ }
+ },
+ child: child,
+ );
+ }
+}
diff --git a/lib/pages/chat/input_bar.dart b/lib/pages/chat/input_bar/input_bar.dart
similarity index 76%
rename from lib/pages/chat/input_bar.dart
rename to lib/pages/chat/input_bar/input_bar.dart
index bce81fe17c..afd418bd97 100644
--- a/lib/pages/chat/input_bar.dart
+++ b/lib/pages/chat/input_bar/input_bar.dart
@@ -1,7 +1,12 @@
-import 'package:fluffychat/utils/extension/raw_key_event_extension.dart';
+import 'package:fluffychat/pages/chat/command_hints.dart';
+import 'package:fluffychat/pages/chat/input_bar/context_menu_input_bar.dart';
+import 'package:fluffychat/pages/chat/input_bar/input_bar_shortcut.dart';
+import 'package:fluffychat/presentation/mixins/paste_image_mixin.dart';
+import 'package:fluffychat/utils/clipboard.dart';
import 'package:fluffychat/widgets/avatar/avatar.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/material.dart';
+import 'package:fluffychat/presentation/extensions/text_editting_controller_extension.dart';
import 'package:emojis/emoji.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
@@ -9,13 +14,10 @@ import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:matrix/matrix.dart';
import 'package:slugify/slugify.dart';
-import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/widgets/mxc_image.dart';
-import 'command_hints.dart';
-
-class InputBar extends StatelessWidget {
+class InputBar extends StatelessWidget with PasteImageMixin {
final Room? room;
final int? minLines;
final int? maxLines;
@@ -30,7 +32,7 @@ class InputBar extends StatelessWidget {
final bool? autofocus;
final bool readOnly;
- const InputBar({
+ InputBar({
this.room,
this.minLines,
this.maxLines,
@@ -299,64 +301,113 @@ class InputBar extends StatelessWidget {
}
}
+ Future handlePaste(BuildContext context) async {
+ if (await Clipboard.instance.isReadableImageFormat() && room != null) {
+ await pasteImage(context, room!);
+ } else {
+ await controller?.pasteText();
+ }
+ }
+
@override
Widget build(BuildContext context) {
- final useShortCuts = (PlatformInfos.isWeb ||
- PlatformInfos.isDesktop ||
- AppConfig.sendOnEnter);
- return RawKeyboardListener(
- focusNode: keyboardFocusNode,
- onKey: (event) {
- if (useShortCuts && event.isEnter) {
- onSubmitted?.call(controller?.text ?? '');
- }
- },
- child: TypeAheadField