Merge branch 'main' into graphene

This commit is contained in:
vishnukvmd 2024-02-14 18:59:48 +05:30
commit 4d220bf7c6
49 changed files with 304 additions and 136 deletions

View file

@ -1,5 +1,17 @@
# CHANGELOG
## v0.8.54
### Added
* #### Map View ✨
You can now view the location where a photo was clicked. Open a photo and tap the Info button to view its place on the map!
* #### Bug Fixes
Many a bugs were squashed in this release. If you run into any, please write to team@ente.io, or let us know on Discord! 🙏
## v0.7.118

View file

@ -1,36 +1,36 @@
ente ist eine einfache App, um Ihre Fotos und Videos automatisch zu sichern und zu organisieren.
Wenn Sie auf der Suche nach einer privaten Alternative sind, um Ihre Erinnerungen zu bewahren, sind Sie an der richtigen Stelle. Die müssen nicht mal ente haben. ente benötigt bestimmte Berechtigungen um als Anbieter eines Fotospeichers fungieren zu können. Mit Ente werden sie Ende-zu-Ende-verschlüsselt gespeichert (e2ee). Dies bedeutet, dass nur Sie sie sehen können.
Wenn Sie auf der Suche nach einer datenschutzfreundlichen Alternative zu Google Fotos sind, sind Sie an der richtigen Stelle. Mit Ente werden Ihre Fotos Ende-zu-Ende-verschlüsselt gespeichert (e2ee). Dies bedeutet, dass nur Sie sie sehen können.
Wir haben Open-Source Apps auf allen Plattformen, und Ihre Fotos werden nahtlos zwischen all Ihren Geräten verschlüsselt (e2ee) synchronisiert.
Wir haben Open-Source-Apps für Android, iOS, Web und Desktop. Ihre Fotos werden verschlüsselt (e2ee) zwischen allen Geräten synchronisiert.
ente ermöglicht es deine Alben simpel & schnell mit deinen Geliebten zu teilen. Du kannst öffentlich einsehbare Links teilen, wo sie dein Album sehen und zusammenarbeiten können, indem sie Fotos hinzufügen, sogar ohne einen Account oder eine App.
ente ermöglicht es, deine Alben simpel & schnell mit deinen Geliebten zu teilen. Sie können öffentlich einsehbare Links teilen, sodass andere sogar ohne einen Account oder eine App Ihr Album sehen und darin zusammenarbeiten können, indem sie Fotos hinzufügen.
Ihre verschlüsselten Daten werden zu 3 verschiedenen Orten repliziert, unter anderem zu einem Schutzbunker in Paris. Wir nehmen die Erhaltung der Nachwelt ernst und machen es Dir leicht, dafür zu sorgen, dass Deine Erinnerungen Dich überdauern.
Ihre verschlüsselten Daten werden an 3 verschiedenen Orten gespeichert, unter anderem in einem Schutzbunker in Paris. Wir nehmen die Erhaltung der Nachwelt ernst und machen es Ihnen leicht, dafür zu sorgen, dass Ihre Erinnerungen Sie überdauern.
Wir sind hier, um die sicherste Foto-App aller Zeiten zu entwickeln, begleite uns auf unserem Weg!
FEATURES
- Sicherungen in Originalqualität, jeder Pixel ist wichtig
- Familienpläne, damit Du den Speicher mit Deiner Familie teilen kannst
- Kollaborative Alben, sodass du nach einer Reise Fotos zusammenstellen kannst
- Geteilte Ordner für den Fall, dass Dein Partner Deine "Kamera" Klicks genießen soll
- Links zu einem Album, welche mit einem Passwort geschützt werden können
- Möglichkeit Speicherplatz freizugeben, indem bereits gesicherte Daten auf dem Gerät entfernt werden
- Menschliche Unterstützung, denn Sie sind es wert
- Sicherungen in Originalqualität, weil jeder Pixel zählt
- Familien-Abos, damit Sie den Speicherplatz mit Ihrer Familie teilen können
- Kollaborative Alben, sodass Sie nach einer Reise Fotos sammeln können
- Geteilte Ordner für den Fall, dass Ihr Partner Ihre "Kamera" Klicks genießen soll
- Album-Links, die mit einem Passwort geschützt werden können
- Möglichkeit, Speicherplatz freizugeben, indem bereits gesicherte Daten auf dem Gerät entfernt werden
- Menschlicher Support, denn Sie sind es wert
- Beschreibungen, damit Sie Ihre Erinnerungen beschriften und leicht wiederfinden können
- Integrierte Bildbearbeitung, um den letzten Schliff zu geben
- Favorisiere, verstecke und erlebe deine Erinnerungen, denn sie sind kostbar
- Importieren Sie mit einem Klick von Google, Apple, Ihrer Festplatte und mehr
- Foto-Editor, um Ihren Fotos den Feinschliff zu verpassen
- Favorisieren, verstecken und erleben Sie Ihre Erinnerungen, denn sie sind kostbar
- Ein-Klick-Import von Google, Apple, Ihrer Festplatte und mehr
- Dunkles Theme, weil Ihre Fotos darin gut aussehen
- 2FA, 3FA, biometrische Authentifizierung
- und noch VIELES mehr!
BERECHTIGUNGEN
Diese können unter folgendem Link betrachtet werden: https://github.com/ente-io/photos-app/blob/f-droid/android/permissions.md
ente benötigt bestimmte Berechtigungen, um als Fotospeicher zu funktionieren. Diese können unter folgendem Link überprüft werden: https://github.com/ente-io/photos-app/blob/f-droid/android/permissions.md
PREIS
Wir bieten keine lebenslang kostenlosen Abonnements an, da es für uns wichtig ist, einen nachhaltigen Service anzubieten. Wir bieten jedoch bezahlbare Abonemments an, welche auch mit der Familie geteilt werden können. Mehr Informationen sind auf ente.io zu finden.
SUPPORT
Wir sind stolz darauf einen persönlichen Support anzubieten. Falls Sie ein Abonnement besitzen, können Sie sich mit Ihrem Anliegen via E-Mail an team@ente.io wenden und erhalten eine Antwort innerhalb von 24 Stunden.
Wir sind stolz darauf, einen persönlichen Support anzubieten. Falls Sie ein Abonnement besitzen, können Sie sich mit Ihrem Anliegen via E-Mail an team@ente.io wenden und erhalten eine Antwort innerhalb von 24 Stunden.

View file

@ -0,0 +1,36 @@
ente é um aplicativo simples para fazer backup e compartilhar suas fotos e vídeos.
Se você está procurando uma alternativa ao Google Photos com foco em privacidade, veio ao lugar certo. Com ente, eles são armazenados com criptografia de ponta a ponta (e2ee). Isso significa que só você pode vê-los.
Temos aplicativos de código aberto em todas as plataformas, Android, iOS, web e desktop, e suas fotos irão sincronizar perfeitamente entre todas elas de forma criptografada (e2ee).
ente também torna simples compartilhar seus álbuns com seus entes queridos, mesmo que eles não estejam no ente. Você pode compartilhar links para visualização pública, onde eles podem visualizar seu álbum e colaborar adicionando fotos a ele, mesmo sem uma conta ou app.
Seus dados criptografados são replicados em 3 locais diferentes, incluindo um abrigo avançado em Paris. Levamos a sério a nossa postura e fazemos com que seja fácil garantir que suas memórias vivam.
Estamos aqui para se tornar o app de fotos mais seguro de todos, venha entrar em nossa jornada!
RECURSOS
- Cópia de qualidade original, porque cada pixel é importante
- Planos de família, para que você possa compartilhar o armazenamento com sua família
- Álbuns colaborativos, para que você possa agrupar fotos após uma corrida
- Pastas compartilhadas, caso você queira que seu parceiro aproveite seus cliques da "Câmera"
- Links de álbuns, que podem ser protegidos com uma senha e definidos para expirar
- Capacidade de liberar espaço, removendo arquivos que foram salvos com segurança
- Suporte humano, porque você vale a pena
- Descrições, para que você possa captar suas memórias e encontrá-las facilmente
- Editor de imagens, para adicionar toques finais
- Favoritar, esconder e reviver suas memórias, pois elas são preciosas
- Importar com um clique do Google, Apple, seu disco rígido e muito mais
- Tema escuro, porque suas fotos parecem bem nele
- 2FA, 3FA, Autenticação biométrica
- e MUITO MAIS!
PERMISSÕES
ente solicita certas permissões para servir o propósito de um provedor de armazenamento de fotos, que pode ser revisado aqui: https://github.com/ente-io/photos-app/blob/f-droid/android/permissions.md
PREÇO
Não oferecemos planos gratuitos para sempre, porque é importante para nós que permaneçamos sustentáveis e resistamos à prova do tempo. Em vez disso, oferecemos planos acessíveis que você pode compartilhar livremente com sua família. Você pode encontrar mais informações em ente.io.
SUPORTE
Temos orgulho em oferecer apoio humano. Temos orgulho em oferecer apoio humano. Se você é o nosso cliente pago, você pode entrar em contato com o team@ente.io e esperar uma resposta da nossa equipe dentro de 24 horas.

View file

@ -0,0 +1 @@
ente é um aplicativo de armazenamento de fotos criptografado de ponta a ponta

View file

@ -0,0 +1 @@
ente - armazenamento criptografado de fotos

View file

@ -0,0 +1,33 @@
Ente é um aplicativo simples para fazer backup e compartilhar suas fotos e vídeos.
Se você está procurando uma alternativa ao Google Photos com foco em privacidade, veio ao lugar certo. Com ente, eles são armazenados com criptografia de ponta a ponta (e2ee). Isso significa que só você pode vê-los.
Temos aplicativos de código aberto em Android, iOS, web e desktop, e suas fotos irão sincronizar perfeitamente entre todas elas de forma criptografada (e2ee).
Ente também torna simples compartilhar seus álbuns com seus entes queridos. Você pode compartilhá-los diretamente com outros usuários do Ente, criptografados de ponta a ponta; ou com links publicamente visíveis.
Seus dados criptografados são replicados em locais diferentes, incluindo um abrigo avançado em Paris. Levamos a sério a nossa postura e fazemos com que seja fácil garantir que suas memórias vivam.
Estamos aqui para se tornar o app de fotos mais seguro de todos, venha entrar em nossa jornada!
RECURSOS
- Cópia de qualidade original, porque cada pixel é importante
- Planos de família, para que você possa compartilhar o armazenamento com sua família
- Pastas compartilhadas, caso você queira que seu parceiro aproveite seus cliques da "Câmera"
- Links de álbuns, que podem ser protegidos com uma senha e definidos para expirar
- Capacidade de liberar espaço, removendo arquivos que foram salvos com segurança
- Editor de imagens, para adicionar toques finais
- Favoritar, esconder e reviver suas memórias, pois elas são preciosas
- Importar com um clique de todos os principais provedores de armazenamento
- Tema escuro, porque suas fotos parecem bem nele
- 2FA, 3FA, Autenticação biométrica
- e MUITO MAIS!
PREÇO
Não oferecemos planos gratuitos para sempre, porque é importante para nós que permaneçamos sustentáveis e resistamos à prova do tempo. Em vez disso, oferecemos planos acessíveis que você pode compartilhar livremente com sua família. Você pode encontrar mais informações em ente.io.
SUPORTE
Temos orgulho em oferecer apoio humano. Temos orgulho em oferecer apoio humano. Se você é o nosso cliente pago, você pode entrar em contato com o team@ente.io e esperar uma resposta da nossa equipe dentro de 24 horas.
TERMOS
https://ente.io/terms

View file

@ -0,0 +1 @@
fotos,fotografia,família,privacidade,nuvem,backup,vídeos,foto,criptografia,armazenamento,álbum,alternativa

View file

@ -0,0 +1 @@
ente Fotos

View file

@ -0,0 +1 @@
Armazenamento de fotos criptografado

View file

@ -2,7 +2,7 @@ Ente ist eine einfache Anwendung zur automatischen Sicherung und Organisation Ih
Wenn Sie auf der Suche nach einer datenschutzfreundlichen Alternative sind, um Ihre Erinnerungen zu bewahren, sind Sie hier genau richtig. Mit Ente werden sie Ende-zu-Ende-verschlüsselt (e2ee) gespeichert. Das bedeutet, dass nur Sie sie sehen können.
Wir haben Apps für Android, iOS, Web und Desktop und Ihre Fotos werden nahtlos zwischen all Ihren Geräten auf eine Ende-zu-Ende-verschlüsselte (e2ee) Weise synchronisiert.
Wir haben Open-Source-Apps für Android, iOS, Web und Desktop. Ihre Fotos werden verschlüsselt (e2ee) zwischen allen Geräten synchronisiert.
Mit Ente ist es auch ganz einfach, Ihre Alben mit Ihren Lieben zu teilen. Sie können sie entweder direkt mit anderen Ente-Benutzern teilen, Ende-zu-Ende-verschlüsselt, oder mit öffentlich einsehbaren Links.
@ -12,11 +12,11 @@ Wir sind hier, um die sicherste Foto-App aller Zeiten zu entwickeln, begleiten S
✨ FUNKTIONEN
- Sicherungen in Originalqualität, denn jeder Pixel ist wichtig
- Familien-Abos, damit Sie den Speicherplatz mit Ihrer Familie teilen können
- Familien-Abos, damit Sie den Speicherplatz mit Ihrer Familie teilen können
- Gemeinsame Ordner, falls Sie möchten, dass Ihr Partner Ihre „Kamera“-Klicks genießen kann
- Album-Links, die mit einem Passwort geschützt werden können und deren Gültigkeit abläuft
- Möglichkeit, Speicherplatz freizugeben, indem Dateien, die sicher gespeichert wurden, entfernt werden
- Bildbearbeitungsprogramm, um den letzten Schliff zu geben
- Foto-Editor, um Ihren Fotos den Feinschliff zu verpassen
- Favorisieren, verstecken und erleben Sie Ihre Erinnerungen, denn sie sind kostbar
- Ein-Klick-Import von Google, Apple, Ihrer Festplatte und mehr
- Dunkles Theme, weil Ihre Fotos darin gut aussehen

View file

@ -0,0 +1,30 @@
Ente é um aplicativo simples para fazer backup e compartilhar suas fotos e vídeos.
Se você está procurando uma alternativa ao Google Photos com foco em privacidade, veio ao lugar certo. Com ente, eles são armazenados com criptografados de ponta a ponta (e2ee). Isso significa que só você pode vê-los.
Temos aplicativos de código aberto em todas as plataformas, Android, iOS, web e desktop, e suas fotos irão sincronizar perfeitamente entre todas elas de forma criptografada (e2ee).
Ente também torna simples compartilhar seus álbuns com seus entes queridos. Você pode compartilhá-los diretamente com outros usuários do Ente, criptografados de ponta a ponta; ou com links publicamente visíveis.
Seus dados criptografados são replicados em locais diferentes, incluindo um abrigo avançado em Paris. Levamos a sério a nossa postura e fazemos com que seja fácil garantir que suas memórias vivam.
Estamos aqui para se tornar o app de fotos mais seguro de todos, venha entrar em nossa jornada!
✨ RECURSOS
- Cópia de qualidade original, porque cada pixel é importante
- Planos de família, para que você possa compartilhar o armazenamento com sua família
- Pastas compartilhadas, caso você queira que seu parceiro aproveite seus cliques da "Câmera"
- Links de álbuns, que podem ser protegidos com uma senha e definidos para expirar
- Capacidade de liberar espaço, removendo arquivos que foram salvos com segurança
- Editor de imagens, para adicionar toques finais
- Favoritar, esconder e reviver suas memórias, pois elas são preciosas
- Importar com um clique do Google, Apple, seu disco rígido e muito mais
- Tema escuro, porque suas fotos parecem bem nele
- 2FA, 3FA, Autenticação biométrica
- e MUITO MAIS!
💲 PREÇO
Não oferecemos planos gratuitos para sempre, porque é importante para nós que permaneçamos sustentáveis e resistamos à prova do tempo. Em vez disso, oferecemos planos acessíveis que você pode compartilhar livremente com sua família. Você pode encontrar mais informações em ente.io.
🙋 SUPORTE
Temos orgulho em oferecer apoio humano. Temos orgulho em oferecer apoio humano. Se você é o nosso cliente pago, você pode entrar em contato com o team@ente.io e esperar uma resposta da nossa equipe dentro de 24 horas.

View file

@ -0,0 +1 @@
Armazenamento de fotos criptografado - backup, organize e compartilhe suas fotos e vídeos

View file

@ -0,0 +1 @@
ente Fotos

View file

@ -0,0 +1,3 @@
import "package:photos/events/event.dart";
class PauseVideoEvent extends Event {}

View file

@ -34,6 +34,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage(
"Edits to location will only be seen within Ente"),
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"modifyYourQueryOrTrySearchingFor":
MessageLookupByLibrary.simpleMessage(
"Modify your query, or try searching for"),

View file

@ -815,6 +815,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Elemente zeigen die Anzahl der Tage bis zum dauerhaften Löschen an"),
"itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage(
"Ausgewählte Elemente werden aus diesem Album entfernt"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"keepPhotos": MessageLookupByLibrary.simpleMessage("Fotos behalten"),
"kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"),
"kindlyHelpUsWithThisInformation":

View file

@ -790,6 +790,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Items show the number of days remaining before permanent deletion"),
"itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage(
"Selected items will be removed from this album"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"keepPhotos": MessageLookupByLibrary.simpleMessage("Keep Photos"),
"kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"),
"kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage(

View file

@ -703,6 +703,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Los artículos muestran el número de días restantes antes de ser borrados permanente"),
"itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage(
"Los elementos seleccionados serán removidos de este álbum"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"keepPhotos":
MessageLookupByLibrary.simpleMessage("Conservar las fotos"),
"kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"),

View file

@ -811,6 +811,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Les éléments montrent le nombre de jours restants avant la suppression définitive"),
"itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage(
"Les éléments sélectionnés seront supprimés de cet album"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"keepPhotos":
MessageLookupByLibrary.simpleMessage("Conserver les photos"),
"kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"),

View file

@ -780,6 +780,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Gli elementi mostrano il numero di giorni rimanenti prima della cancellazione permanente"),
"itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage(
"Gli elementi selezionati saranno rimossi da questo album"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"keepPhotos": MessageLookupByLibrary.simpleMessage("Mantieni foto"),
"kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"),
"kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage(

View file

@ -34,6 +34,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage(
"Edits to location will only be seen within Ente"),
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"modifyYourQueryOrTrySearchingFor":
MessageLookupByLibrary.simpleMessage(
"Modify your query, or try searching for"),

View file

@ -392,6 +392,8 @@ class MessageLookup extends MessageLookupByLibrary {
"cannotAddMorePhotosAfterBecomingViewer": m7,
"cannotDeleteSharedFiles": MessageLookupByLibrary.simpleMessage(
"Kan gedeelde bestanden niet verwijderen"),
"castInstruction": MessageLookupByLibrary.simpleMessage(
"Bezoek cast.ente.io op het apparaat dat u wilt koppelen.\n\nVoer de code hieronder in om het album op uw TV af te spelen."),
"centerPoint": MessageLookupByLibrary.simpleMessage("Middelpunt"),
"changeEmail": MessageLookupByLibrary.simpleMessage("E-mail wijzigen"),
"changeLocationOfSelectedItems": MessageLookupByLibrary.simpleMessage(
@ -569,10 +571,14 @@ class MessageLookup extends MessageLookupByLibrary {
"details": MessageLookupByLibrary.simpleMessage("Details"),
"devAccountChanged": MessageLookupByLibrary.simpleMessage(
"Het ontwikkelaarsaccount dat we gebruiken om te publiceren in de App Store is veranderd. Daarom moet je opnieuw inloggen.\n\nOnze excuses voor het ongemak, helaas was dit onvermijdelijk."),
"deviceCodeHint":
MessageLookupByLibrary.simpleMessage("Voer de code in"),
"deviceFilesAutoUploading": MessageLookupByLibrary.simpleMessage(
"Bestanden toegevoegd aan dit album van dit apparaat zullen automatisch geüpload worden naar ente."),
"deviceLockExplanation": MessageLookupByLibrary.simpleMessage(
"Schakel de schermvergrendeling van het apparaat uit wanneer ente op de voorgrond is en er een back-up aan de gang is. Dit is normaal gesproken niet nodig, maar kan grote uploads en initiële imports van grote mappen sneller laten verlopen."),
"deviceNotFound":
MessageLookupByLibrary.simpleMessage("Apparaat niet gevonden"),
"didYouKnow": MessageLookupByLibrary.simpleMessage("Wist u dat?"),
"disableAutoLock": MessageLookupByLibrary.simpleMessage(
"Automatisch vergrendelen uitschakelen"),
@ -816,6 +822,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Bestanden tonen het aantal resterende dagen voordat ze permanent worden verwijderd"),
"itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage(
"Geselecteerde items zullen worden verwijderd uit dit album"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"keepPhotos": MessageLookupByLibrary.simpleMessage("Foto\'s behouden"),
"kiloMeterUnit": MessageLookupByLibrary.simpleMessage("km"),
"kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage(
@ -987,6 +994,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Optioneel, zo kort als je wilt..."),
"orPickAnExistingOne":
MessageLookupByLibrary.simpleMessage("Of kies een bestaande"),
"pair": MessageLookupByLibrary.simpleMessage("Koppelen"),
"password": MessageLookupByLibrary.simpleMessage("Wachtwoord"),
"passwordChangedSuccessfully": MessageLookupByLibrary.simpleMessage(
"Wachtwoord succesvol aangepast"),
@ -1025,6 +1033,8 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Kies middelpunt"),
"pinAlbum":
MessageLookupByLibrary.simpleMessage("Album bovenaan vastzetten"),
"playOnTv":
MessageLookupByLibrary.simpleMessage("Album afspelen op TV"),
"playStoreFreeTrialValidTill": m37,
"playstoreSubscription":
MessageLookupByLibrary.simpleMessage("PlayStore abonnement"),

View file

@ -54,6 +54,7 @@ class MessageLookup extends MessageLookupByLibrary {
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
"invalidEmailAddress":
MessageLookupByLibrary.simpleMessage("Ugyldig e-postadresse"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage(
"Vær vennlig og hjelp oss med denne informasjonen"),
"modifyYourQueryOrTrySearchingFor":

View file

@ -113,6 +113,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Nieprawidłowy klucz odzyskiwania"),
"invalidEmailAddress":
MessageLookupByLibrary.simpleMessage("Nieprawidłowy adres e-mail"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"kindlyHelpUsWithThisInformation":
MessageLookupByLibrary.simpleMessage("Pomóż nam z tą informacją"),
"logInLabel": MessageLookupByLibrary.simpleMessage("Zaloguj się"),

View file

@ -252,6 +252,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Convide seus amigos"),
"itemsWillBeRemovedFromAlbum": MessageLookupByLibrary.simpleMessage(
"Os itens selecionados serão removidos deste álbum"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
"keepPhotos": MessageLookupByLibrary.simpleMessage("Manter fotos"),
"kindlyHelpUsWithThisInformation": MessageLookupByLibrary.simpleMessage(
"Ajude-nos com esta informação"),

View file

@ -666,6 +666,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("项目显示永久删除前剩余的天数"),
"itemsWillBeRemovedFromAlbum":
MessageLookupByLibrary.simpleMessage("所选项目将从此相册中移除"),
"joinDiscord": MessageLookupByLibrary.simpleMessage("加入 Discord"),
"keepPhotos": MessageLookupByLibrary.simpleMessage("保留照片"),
"kiloMeterUnit": MessageLookupByLibrary.simpleMessage("公里"),
"kindlyHelpUsWithThisInformation":

View file

@ -8357,6 +8357,16 @@ class S {
args: [],
);
}
/// `Join Discord`
String get joinDiscord {
return Intl.message(
'Join Discord',
name: 'joinDiscord',
desc: '',
args: [],
);
}
}
class AppLocalizationDelegate extends LocalizationsDelegate<S> {

View file

@ -10,5 +10,6 @@
"selectALocation": "Select a location",
"selectALocationFirst": "Select a location first",
"changeLocationOfSelectedItems": "Change location of selected items?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente"
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente",
"joinDiscord": "Join Discord"
}

View file

@ -1178,5 +1178,6 @@
"selectALocationFirst": "Wähle zuerst einen Standort",
"changeLocationOfSelectedItems": "Standort der gewählten Elemente ändern?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Änderungen des Standorts werden nur in ente sichtbar sein",
"cleanUncategorized": "Unkategorisiert leeren"
"cleanUncategorized": "Unkategorisiert leeren",
"joinDiscord": "Join Discord"
}

View file

@ -1192,5 +1192,6 @@
"pair": "Pair",
"deviceNotFound": "Device not found",
"castInstruction": "Visit cast.ente.io on the device you want to pair.\n\nEnter the code below to play the album on your TV.",
"deviceCodeHint": "Enter the code"
}
"deviceCodeHint": "Enter the code",
"joinDiscord": "Join Discord"
}

View file

@ -973,5 +973,6 @@
"selectALocation": "Select a location",
"selectALocationFirst": "Select a location first",
"changeLocationOfSelectedItems": "Change location of selected items?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente"
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente",
"joinDiscord": "Join Discord"
}

View file

@ -1154,5 +1154,6 @@
"selectALocation": "Select a location",
"selectALocationFirst": "Select a location first",
"changeLocationOfSelectedItems": "Change location of selected items?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente"
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente",
"joinDiscord": "Join Discord"
}

View file

@ -1116,5 +1116,6 @@
"selectALocation": "Select a location",
"selectALocationFirst": "Select a location first",
"changeLocationOfSelectedItems": "Change location of selected items?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente"
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente",
"joinDiscord": "Join Discord"
}

View file

@ -10,5 +10,6 @@
"selectALocation": "Select a location",
"selectALocationFirst": "Select a location first",
"changeLocationOfSelectedItems": "Change location of selected items?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente"
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente",
"joinDiscord": "Join Discord"
}

View file

@ -1187,5 +1187,11 @@
"selectALocationFirst": "Selecteer eerst een locatie",
"changeLocationOfSelectedItems": "Locatie van geselecteerde items wijzigen?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Bewerkte locatie wordt alleen gezien binnen Ente",
"cleanUncategorized": "Ongecategoriseerd opschonen"
"cleanUncategorized": "Ongecategoriseerd opschonen",
"playOnTv": "Album afspelen op TV",
"pair": "Koppelen",
"deviceNotFound": "Apparaat niet gevonden",
"castInstruction": "Bezoek cast.ente.io op het apparaat dat u wilt koppelen.\n\nVoer de code hieronder in om het album op uw TV af te spelen.",
"deviceCodeHint": "Voer de code in",
"joinDiscord": "Join Discord"
}

View file

@ -24,5 +24,6 @@
"selectALocation": "Select a location",
"selectALocationFirst": "Select a location first",
"changeLocationOfSelectedItems": "Change location of selected items?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente"
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente",
"joinDiscord": "Join Discord"
}

View file

@ -111,5 +111,6 @@
"selectALocation": "Select a location",
"selectALocationFirst": "Select a location first",
"changeLocationOfSelectedItems": "Change location of selected items?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente"
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente",
"joinDiscord": "Join Discord"
}

View file

@ -277,5 +277,6 @@
"selectALocation": "Select a location",
"selectALocationFirst": "Select a location first",
"changeLocationOfSelectedItems": "Change location of selected items?",
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente"
"editsToLocationWillOnlyBeSeenWithinEnte": "Edits to location will only be seen within Ente",
"joinDiscord": "Join Discord"
}

View file

@ -1192,5 +1192,6 @@
"pair": "配对",
"deviceNotFound": "未发现设备",
"castInstruction": "在您要配对的设备上访问 cast.ente.io。\n输入下面的代码即可在电视上播放相册。",
"deviceCodeHint": "输入代码"
"deviceCodeHint": "输入代码",
"joinDiscord": "加入 Discord"
}

View file

@ -27,7 +27,7 @@ class RemoteAssetsService {
}
Future<String> _getLocalPath(String remotePath) async {
return (await getTemporaryDirectory()).path +
return (await getApplicationSupportDirectory()).path +
"/assets/" +
_urlToFileName(remotePath);
}
@ -53,5 +53,6 @@ class RemoteAssetsService {
await existingFile.delete();
}
await NetworkClient.instance.getDio().download(url, savePath);
_logger.info("Downloaded " + url);
}
}

View file

@ -609,9 +609,6 @@ class SearchService {
result[tag] = [];
}
}
if (result.isEmpty && !showNoLocationTag) {
return searchResults;
}
final allFiles = await getAllFiles();
for (EnteFile file in allFiles) {
if (file.hasLocation) {

View file

@ -2,15 +2,13 @@ import "dart:async";
import "dart:io";
import "package:connectivity_plus/connectivity_plus.dart";
import "package:flutter/services.dart";
import "package:logging/logging.dart";
import "package:path/path.dart";
import "package:path_provider/path_provider.dart";
import "package:photos/core/errors.dart";
import "package:photos/core/event_bus.dart";
import "package:photos/core/network/network.dart";
import "package:photos/events/event.dart";
import "package:photos/services/remote_assets_service.dart";
abstract class MLFramework {
static const kImageEncoderEnabled = true;
@ -105,46 +103,20 @@ abstract class MLFramework {
return;
}
_initState = InitializationState.initializingImageModel;
final path = await _getLocalImageModelPath();
if (await File(path).exists()) {
await loadImageModel(path);
} else {
_initState = InitializationState.downloadingImageModel;
final tempFile = File(path + ".temp");
await _downloadFile(getImageModelRemotePath(), tempFile.path);
await tempFile.rename(path);
await loadImageModel(path);
}
final imageModel =
await RemoteAssetsService.instance.getAsset(getImageModelRemotePath());
await loadImageModel(imageModel.path);
_initState = InitializationState.initializedImageModel;
}
Future<void> _initTextModel() async {
final path = await _getLocalTextModelPath();
_initState = InitializationState.initializingTextModel;
if (await File(path).exists()) {
await loadTextModel(path);
} else {
_initState = InitializationState.downloadingTextModel;
final tempFile = File(path + ".temp");
await _downloadFile(getTextModelRemotePath(), tempFile.path);
await tempFile.rename(path);
await loadTextModel(path);
}
final textModel =
await RemoteAssetsService.instance.getAsset(getTextModelRemotePath());
await loadTextModel(textModel.path);
_initState = InitializationState.initializedTextModel;
}
Future<String> _getLocalImageModelPath() async {
return (await getTemporaryDirectory()).path +
"/models/" +
basename(getImageModelRemotePath());
}
Future<String> _getLocalTextModelPath() async {
return (await getTemporaryDirectory()).path +
"/models/" +
basename(getTextModelRemotePath());
}
Future<void> _downloadFile(
String url,
String savePath, {
@ -176,17 +148,6 @@ abstract class MLFramework {
return connectivityResult != ConnectivityResult.mobile ||
shouldDownloadOverMobileData;
}
Future<String> getAccessiblePathForAsset(
String assetPath,
String tempName,
) async {
final byteData = await rootBundle.load(assetPath);
final tempDir = await getTemporaryDirectory();
final file = await File('${tempDir.path}/$tempName')
.writeAsBytes(byteData.buffer.asUint8List());
return file.path;
}
}
class MLFrameworkInitializationUpdateEvent extends Event {
@ -198,10 +159,8 @@ class MLFrameworkInitializationUpdateEvent extends Event {
enum InitializationState {
notInitialized,
waitingForNetwork,
downloadingImageModel,
initializingImageModel,
initializedImageModel,
downloadingTextModel,
initializingTextModel,
initializedTextModel,
initialized,

View file

@ -16,7 +16,7 @@ class UpdateService {
static final UpdateService instance = UpdateService._privateConstructor();
static const kUpdateAvailableShownTimeKey = "update_available_shown_time_key";
static const changeLogVersionKey = "update_change_log_key";
static const currentChangeLogVersion = 13;
static const currentChangeLogVersion = 14;
LatestVersionInfo? _latestVersion;
final _logger = Logger("UpdateService");
@ -73,30 +73,39 @@ class UpdateService {
return _latestVersion;
}
Future<void> showUpdateNotification() async {
if (!isIndependent()) {
return;
}
Future<bool> shouldShowUpdateNoification() async {
final shouldUpdate = await this.shouldUpdate();
final lastNotificationShownTime =
_prefs.getInt(kUpdateAvailableShownTimeKey) ?? 0;
final now = DateTime.now().microsecondsSinceEpoch;
final hasBeen3DaysSinceLastNotification =
(now - lastNotificationShownTime) > (3 * microSecondsInDay);
if (shouldUpdate &&
hasBeen3DaysSinceLastNotification &&
_latestVersion!.shouldNotify) {
final hasBeenThresholdDaysSinceLastNotification =
(now - lastNotificationShownTime) >
((_latestVersion!.shouldNotify ? 1 : 3) * microSecondsInDay);
return shouldUpdate && hasBeenThresholdDaysSinceLastNotification;
}
Future<void> showUpdateNotification() async {
if (await shouldShowUpdateNoification()) {
// ignore: unawaited_futures
NotificationService.instance.showNotification(
"Update available",
"Click to install our best version yet",
);
await _prefs.setInt(kUpdateAvailableShownTimeKey, now);
await resetUpdateAvailableShownTime();
} else {
_logger.info("Debouncing notification");
}
}
Future<void> resetUpdateAvailableShownTime() {
return _prefs.setInt(
kUpdateAvailableShownTimeKey,
DateTime.now().microsecondsSinceEpoch,
);
}
Future<LatestVersionInfo> _getLatestVersionInfo() async {
final response = await NetworkClient.instance
.getDio()

View file

@ -1,3 +1,5 @@
import "dart:async";
import 'package:flutter/material.dart';
import "package:photos/generated/l10n.dart";
import 'package:photos/services/update_service.dart';
@ -7,6 +9,7 @@ import 'package:photos/ui/components/divider_widget.dart';
import 'package:photos/ui/components/models/button_type.dart';
import 'package:photos/ui/components/title_bar_title_widget.dart';
import 'package:photos/ui/notification/update/change_log_entry.dart';
import "package:url_launcher/url_launcher_string.dart";
class ChangeLogPage extends StatefulWidget {
const ChangeLogPage({
@ -81,13 +84,28 @@ class _ChangeLogPageState extends State<ChangeLogPage> {
ButtonWidget(
buttonType: ButtonType.trailingIconSecondary,
buttonSize: ButtonSize.large,
labelText: S.of(context).rateTheApp,
icon: Icons.favorite_rounded,
labelText: S.of(context).joinDiscord,
icon: Icons.discord_outlined,
iconColor: enteColorScheme.primary500,
onTap: () async {
await UpdateService.instance.launchReviewUrl();
unawaited(
launchUrlString(
"https://discord.com/invite/z2YVKkycX3",
mode: LaunchMode.externalApplication,
),
);
},
),
// ButtonWidget(
// buttonType: ButtonType.trailingIconSecondary,
// buttonSize: ButtonSize.large,
// labelText: S.of(context).rateTheApp,
// icon: Icons.favorite_rounded,
// iconColor: enteColorScheme.primary500,
// onTap: () async {
// await UpdateService.instance.launchReviewUrl();
// },
// ),
const SizedBox(height: 8),
],
),
@ -102,13 +120,18 @@ class _ChangeLogPageState extends State<ChangeLogPage> {
Widget _getChangeLog() {
final scrollController = ScrollController();
final List<ChangeLogEntry> items = [];
items.add(
items.addAll([
ChangeLogEntry(
"Explore with the new Search Tab",
'Introducing a dedicated search tab with distinct sections for effortless discovery.\n'
'\nYou can now discover items that come under different Locations, Moments, Contacts, Photo descriptions, Albums and File types with ease.\n',
"Map View",
'You can now view the location where a photo was clicked.\n'
'\nOpen a photo and tap the Info button to view its place on the map!',
),
);
ChangeLogEntry(
"Bug Fixes",
'Many a bugs were squashed in this release.\n'
'\nIf you run into any, please write to team@ente.io, or let us know on Discord! 🙏',
),
]);
return Container(
padding: const EdgeInsets.only(left: 16),

View file

@ -1,12 +1,13 @@
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
// import 'package:open_file/open_file.dart';
import 'package:photos/core/configuration.dart';
import 'package:photos/core/network/network.dart';
import 'package:photos/ente_theme_data.dart';
import "package:photos/generated/l10n.dart";
import 'package:photos/services/update_service.dart';
import 'package:photos/theme/ente_theme.dart';
import "package:photos/ui/components/buttons/button_widget.dart";
import "package:photos/ui/components/models/button_type.dart";
import 'package:url_launcher/url_launcher_string.dart';
class AppUpdateDialog extends StatefulWidget {
@ -63,32 +64,28 @@ class _AppUpdateDialogState extends State<AppUpdateDialog> {
children: changelog,
),
const Padding(padding: EdgeInsets.all(8)),
SizedBox(
width: double.infinity,
height: 56,
child: OutlinedButton(
style: Theme.of(context).outlinedButtonTheme.style!.copyWith(
textStyle: MaterialStateProperty.resolveWith<TextStyle>(
(Set<MaterialState> states) {
return enteTextTheme.bodyBold;
},
),
),
onPressed: () async {
Navigator.pop(context);
// ignore: unawaited_futures
showDialog(
context: context,
builder: (BuildContext context) {
return ApkDownloaderDialog(widget.latestVersionInfo);
},
barrierDismissible: false,
);
},
child: Text(
S.of(context).update,
),
),
ButtonWidget(
buttonType: ButtonType.primary,
labelText: S.of(context).update,
onTap: () async {
Navigator.pop(context);
// ignore: unawaited_futures
showDialog(
context: context,
builder: (BuildContext context) {
return ApkDownloaderDialog(widget.latestVersionInfo);
},
barrierDismissible: false,
);
},
),
const SizedBox(height: 6),
ButtonWidget(
buttonType: ButtonType.secondary,
labelText: S.of(context).cancel,
onTap: () async {
Navigator.of(context).pop();
},
),
const Padding(padding: EdgeInsets.all(8)),
Center(

View file

@ -194,9 +194,9 @@ class _HomeWidgetState extends State<HomeWidget> {
},
);
_initDeepLinks();
UpdateService.instance.shouldUpdate().then((shouldUpdate) {
if (shouldUpdate) {
Future.delayed(Duration.zero, () {
UpdateService.instance.shouldShowUpdateNoification().then((value) {
Future.delayed(Duration.zero, () {
if (value) {
showDialog(
context: context,
builder: (BuildContext context) {
@ -206,9 +206,11 @@ class _HomeWidgetState extends State<HomeWidget> {
},
barrierColor: Colors.black.withOpacity(0.85),
);
});
}
UpdateService.instance.resetUpdateAvailableShownTime();
}
});
});
// For sharing images coming from outside the app
_initMediaShareSubscription();
WidgetsBinding.instance.addPostFrameCallback(

View file

@ -7,6 +7,8 @@ import "package:logging/logging.dart";
import "package:media_kit/media_kit.dart";
import "package:media_kit_video/media_kit_video.dart";
import "package:photos/core/constants.dart";
import "package:photos/core/event_bus.dart";
import "package:photos/events/pause_video_event.dart";
import "package:photos/generated/l10n.dart";
import "package:photos/models/file/extensions/file_props.dart";
import "package:photos/models/file/file.dart";
@ -43,6 +45,7 @@ class _VideoWidgetNewState extends State<VideoWidgetNew>
final _progressNotifier = ValueNotifier<double?>(null);
late StreamSubscription<bool> playingStreamSubscription;
bool _isAppInFG = true;
late StreamSubscription<PauseVideoEvent> pauseVideoSubscription;
@override
void initState() {
@ -83,6 +86,10 @@ class _VideoWidgetNewState extends State<VideoWidgetNew>
widget.playbackCallback!(event);
}
});
pauseVideoSubscription = Bus.instance.on<PauseVideoEvent>().listen((event) {
player.pause();
});
}
@override
@ -96,6 +103,7 @@ class _VideoWidgetNewState extends State<VideoWidgetNew>
@override
void dispose() {
pauseVideoSubscription.cancel();
removeCallBack(widget.file);
_progressNotifier.dispose();
WidgetsBinding.instance.removeObserver(this);

View file

@ -1,6 +1,8 @@
import "package:flutter/material.dart";
import "package:logging/logging.dart";
import "package:photos/core/event_bus.dart";
import "package:photos/db/files_db.dart";
import "package:photos/events/pause_video_event.dart";
import "package:photos/generated/l10n.dart";
import 'package:photos/models/collection/collection.dart';
import 'package:photos/models/collection/collection_items.dart';
@ -87,6 +89,7 @@ class AlbumsItemWidget extends StatelessWidget {
if (c.isHidden()) {
return;
}
Bus.instance.fire(PauseVideoEvent());
routeToPage(
context,
CollectionPage(

View file

@ -12,7 +12,7 @@ description: ente photos application
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 0.8.53+573
version: 0.8.58+578
environment:
sdk: ">=3.0.0 <4.0.0"