[mob][photos] Show faces index status in settings
This commit is contained in:
parent
1932a92cb8
commit
d9232c1b83
27 changed files with 159 additions and 13 deletions
1
mobile/lib/generated/intl/messages_cs.dart
generated
1
mobile/lib/generated/intl/messages_cs.dart
generated
|
@ -51,6 +51,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
|
||||
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
|
||||
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
|
||||
"locations": MessageLookupByLibrary.simpleMessage("Locations"),
|
||||
"longPressAnEmailToVerifyEndToEndEncryption":
|
||||
|
|
1
mobile/lib/generated/intl/messages_de.dart
generated
1
mobile/lib/generated/intl/messages_de.dart
generated
|
@ -752,6 +752,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
MessageLookupByLibrary.simpleMessage("Als Erinnerung"),
|
||||
"forgotPassword":
|
||||
MessageLookupByLibrary.simpleMessage("Passwort vergessen"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"freeStorageClaimed": MessageLookupByLibrary.simpleMessage(
|
||||
"Kostenlos hinzugefügter Speicherplatz"),
|
||||
"freeStorageOnReferralSuccess": m24,
|
||||
|
|
1
mobile/lib/generated/intl/messages_en.dart
generated
1
mobile/lib/generated/intl/messages_en.dart
generated
|
@ -750,6 +750,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
MessageLookupByLibrary.simpleMessage("for your memories"),
|
||||
"forgotPassword":
|
||||
MessageLookupByLibrary.simpleMessage("Forgot password"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"freeStorageClaimed":
|
||||
MessageLookupByLibrary.simpleMessage("Free storage claimed"),
|
||||
"freeStorageOnReferralSuccess": m24,
|
||||
|
|
1
mobile/lib/generated/intl/messages_es.dart
generated
1
mobile/lib/generated/intl/messages_es.dart
generated
|
@ -653,6 +653,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
MessageLookupByLibrary.simpleMessage("para tus recuerdos"),
|
||||
"forgotPassword":
|
||||
MessageLookupByLibrary.simpleMessage("Olvidé mi contraseña"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"freeStorageClaimed": MessageLookupByLibrary.simpleMessage(
|
||||
"Almacenamiento gratuito reclamado"),
|
||||
"freeStorageOnReferralSuccess": m24,
|
||||
|
|
1
mobile/lib/generated/intl/messages_fr.dart
generated
1
mobile/lib/generated/intl/messages_fr.dart
generated
|
@ -738,6 +738,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
MessageLookupByLibrary.simpleMessage("pour vos souvenirs"),
|
||||
"forgotPassword":
|
||||
MessageLookupByLibrary.simpleMessage("Mot de passe oublié"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"freeStorageClaimed":
|
||||
MessageLookupByLibrary.simpleMessage("Stockage gratuit réclamé"),
|
||||
"freeStorageOnReferralSuccess": m24,
|
||||
|
|
1
mobile/lib/generated/intl/messages_it.dart
generated
1
mobile/lib/generated/intl/messages_it.dart
generated
|
@ -710,6 +710,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
MessageLookupByLibrary.simpleMessage("per i tuoi ricordi"),
|
||||
"forgotPassword":
|
||||
MessageLookupByLibrary.simpleMessage("Password dimenticata"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"freeStorageClaimed":
|
||||
MessageLookupByLibrary.simpleMessage("Spazio gratuito richiesto"),
|
||||
"freeStorageOnReferralSuccess": m24,
|
||||
|
|
1
mobile/lib/generated/intl/messages_ko.dart
generated
1
mobile/lib/generated/intl/messages_ko.dart
generated
|
@ -51,6 +51,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
"faceRecognitionIndexingDescription": MessageLookupByLibrary.simpleMessage(
|
||||
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
|
||||
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
|
||||
"locations": MessageLookupByLibrary.simpleMessage("Locations"),
|
||||
"longPressAnEmailToVerifyEndToEndEncryption":
|
||||
|
|
1
mobile/lib/generated/intl/messages_nl.dart
generated
1
mobile/lib/generated/intl/messages_nl.dart
generated
|
@ -775,6 +775,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
MessageLookupByLibrary.simpleMessage("voor uw herinneringen"),
|
||||
"forgotPassword":
|
||||
MessageLookupByLibrary.simpleMessage("Wachtwoord vergeten"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"freeStorageClaimed":
|
||||
MessageLookupByLibrary.simpleMessage("Gratis opslag geclaimd"),
|
||||
"freeStorageOnReferralSuccess": m24,
|
||||
|
|
1
mobile/lib/generated/intl/messages_no.dart
generated
1
mobile/lib/generated/intl/messages_no.dart
generated
|
@ -69,6 +69,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
"Please note that this will result in a higher bandwidth and battery usage until all items are indexed."),
|
||||
"feedback": MessageLookupByLibrary.simpleMessage("Tilbakemelding"),
|
||||
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"invalidEmailAddress":
|
||||
MessageLookupByLibrary.simpleMessage("Ugyldig e-postadresse"),
|
||||
"joinDiscord": MessageLookupByLibrary.simpleMessage("Join Discord"),
|
||||
|
|
1
mobile/lib/generated/intl/messages_pl.dart
generated
1
mobile/lib/generated/intl/messages_pl.dart
generated
|
@ -119,6 +119,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
"fileTypes": MessageLookupByLibrary.simpleMessage("File types"),
|
||||
"forgotPassword":
|
||||
MessageLookupByLibrary.simpleMessage("Nie pamiętam hasła"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"generatingEncryptionKeys": MessageLookupByLibrary.simpleMessage(
|
||||
"Generowanie kluczy szyfrujących..."),
|
||||
"howItWorks": MessageLookupByLibrary.simpleMessage("Jak to działa"),
|
||||
|
|
1
mobile/lib/generated/intl/messages_pt.dart
generated
1
mobile/lib/generated/intl/messages_pt.dart
generated
|
@ -763,6 +763,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
MessageLookupByLibrary.simpleMessage("para suas memórias"),
|
||||
"forgotPassword":
|
||||
MessageLookupByLibrary.simpleMessage("Esqueceu sua senha"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"freeStorageClaimed": MessageLookupByLibrary.simpleMessage(
|
||||
"Armazenamento gratuito reivindicado"),
|
||||
"freeStorageOnReferralSuccess": m24,
|
||||
|
|
1
mobile/lib/generated/intl/messages_zh.dart
generated
1
mobile/lib/generated/intl/messages_zh.dart
generated
|
@ -630,6 +630,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
"flip": MessageLookupByLibrary.simpleMessage("上下翻转"),
|
||||
"forYourMemories": MessageLookupByLibrary.simpleMessage("为您的回忆"),
|
||||
"forgotPassword": MessageLookupByLibrary.simpleMessage("忘记密码"),
|
||||
"foundFaces": MessageLookupByLibrary.simpleMessage("Found faces"),
|
||||
"freeStorageClaimed": MessageLookupByLibrary.simpleMessage("已领取的免费存储"),
|
||||
"freeStorageOnReferralSuccess": m24,
|
||||
"freeStorageSpace": m25,
|
||||
|
|
10
mobile/lib/generated/l10n.dart
generated
10
mobile/lib/generated/l10n.dart
generated
|
@ -8773,6 +8773,16 @@ class S {
|
|||
args: [],
|
||||
);
|
||||
}
|
||||
|
||||
/// `Found faces`
|
||||
String get foundFaces {
|
||||
return Intl.message(
|
||||
'Found faces',
|
||||
name: 'foundFaces',
|
||||
desc: '',
|
||||
args: [],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class AppLocalizationDelegate extends LocalizationsDelegate<S> {
|
||||
|
|
|
@ -22,5 +22,6 @@
|
|||
"enterPersonName": "Enter person name",
|
||||
"removePersonLabel": "Remove person label",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -1210,5 +1210,6 @@
|
|||
"enterPersonName": "Enter person name",
|
||||
"removePersonLabel": "Remove person label",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -1233,5 +1233,6 @@
|
|||
"autoPair": "Auto pair",
|
||||
"pairWithPin": "Pair with PIN",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -984,5 +984,6 @@
|
|||
"enterPersonName": "Enter person name",
|
||||
"removePersonLabel": "Remove person label",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -1165,5 +1165,6 @@
|
|||
"enterPersonName": "Enter person name",
|
||||
"removePersonLabel": "Remove person label",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -1127,5 +1127,6 @@
|
|||
"enterPersonName": "Enter person name",
|
||||
"removePersonLabel": "Remove person label",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -22,5 +22,6 @@
|
|||
"enterPersonName": "Enter person name",
|
||||
"removePersonLabel": "Remove person label",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -1228,5 +1228,6 @@
|
|||
"castIPMismatchBody": "Zorg ervoor dat je op hetzelfde netwerk zit als de tv.",
|
||||
"pairingComplete": "Koppeling voltooid",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -36,5 +36,6 @@
|
|||
"enterPersonName": "Enter person name",
|
||||
"removePersonLabel": "Remove person label",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -123,5 +123,6 @@
|
|||
"enterPersonName": "Enter person name",
|
||||
"removePersonLabel": "Remove person label",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -1228,5 +1228,6 @@
|
|||
"castIPMismatchBody": "Certifique-se de estar na mesma rede que a TV.",
|
||||
"pairingComplete": "Pareamento concluído",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -1228,5 +1228,6 @@
|
|||
"castIPMismatchBody": "请确保您的设备与电视处于同一网络。",
|
||||
"pairingComplete": "配对完成",
|
||||
"faceRecognition": "Face recognition",
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed."
|
||||
"faceRecognitionIndexingDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"foundFaces": "Found faces"
|
||||
}
|
|
@ -1423,7 +1423,7 @@ class FaceMlService {
|
|||
return ratio;
|
||||
}
|
||||
|
||||
Future<int> getIndexableFilesCount() async {
|
||||
static Future<int> getIndexableFilesCount() async {
|
||||
final List<EnteFile> enteFiles = await SearchService.instance.getAllFiles();
|
||||
final List<EnteFile> indexableFiles = [];
|
||||
for (final enteFile in enteFiles) {
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
import "dart:async";
|
||||
import "dart:math" show max;
|
||||
|
||||
import "package:flutter/material.dart";
|
||||
import "package:intl/intl.dart";
|
||||
import "package:photos/core/event_bus.dart";
|
||||
import 'package:photos/events/embedding_updated_event.dart';
|
||||
import "package:photos/face/db.dart";
|
||||
import "package:photos/generated/l10n.dart";
|
||||
import "package:photos/models/ml/ml_versions.dart";
|
||||
import "package:photos/service_locator.dart";
|
||||
import "package:photos/services/machine_learning/face_ml/face_ml_service.dart";
|
||||
import 'package:photos/services/machine_learning/semantic_search/frameworks/ml_framework.dart';
|
||||
|
@ -216,6 +219,9 @@ class _MachineLearningSettingsPageState
|
|||
const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
hasEnabled
|
||||
? const FaceRecognitionStatusWidget()
|
||||
: const SizedBox.shrink(),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
@ -348,3 +354,109 @@ class _MagicSearchIndexStatsWidgetState
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
class FaceRecognitionStatusWidget extends StatefulWidget {
|
||||
const FaceRecognitionStatusWidget({
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
State<FaceRecognitionStatusWidget> createState() =>
|
||||
FaceRecognitionStatusWidgetState();
|
||||
}
|
||||
|
||||
class FaceRecognitionStatusWidgetState
|
||||
extends State<FaceRecognitionStatusWidget> {
|
||||
Timer? _timer;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_timer = Timer.periodic(const Duration(seconds: 5), (timer) {
|
||||
setState(() {
|
||||
// Your state update logic here
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Future<(int, int, int)> getIndexStatus() async {
|
||||
final indexedFiles = await FaceMLDataDB.instance
|
||||
.getIndexedFileCount(minimumMlVersion: faceMlVersion);
|
||||
final indexableFiles = await FaceMlService.getIndexableFilesCount();
|
||||
final pendingFiles = max(indexableFiles - indexedFiles, 0);
|
||||
final foundFaces = await FaceMLDataDB.instance.getTotalFaceCount();
|
||||
|
||||
return (indexedFiles, pendingFiles, foundFaces);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_timer?.cancel();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
MenuSectionTitle(title: S.of(context).status),
|
||||
Expanded(child: Container()),
|
||||
],
|
||||
),
|
||||
FutureBuilder(
|
||||
future: getIndexStatus(),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
final int indexedFiles = snapshot.data!.$1;
|
||||
final int pendingFiles = snapshot.data!.$2;
|
||||
final int foundFaces = snapshot.data!.$3;
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: S.of(context).indexedItems,
|
||||
),
|
||||
trailingWidget: Text(
|
||||
NumberFormat().format(indexedFiles),
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
),
|
||||
singleBorderRadius: 8,
|
||||
alignCaptionedTextToLeft: true,
|
||||
isGestureDetectorDisabled: true,
|
||||
),
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: S.of(context).pendingItems,
|
||||
),
|
||||
trailingWidget: Text(
|
||||
NumberFormat().format(pendingFiles),
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
),
|
||||
singleBorderRadius: 8,
|
||||
alignCaptionedTextToLeft: true,
|
||||
isGestureDetectorDisabled: true,
|
||||
),
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: S.of(context).foundFaces,
|
||||
),
|
||||
trailingWidget: Text(
|
||||
NumberFormat().format(foundFaces),
|
||||
style: Theme.of(context).textTheme.bodySmall,
|
||||
),
|
||||
singleBorderRadius: 8,
|
||||
alignCaptionedTextToLeft: true,
|
||||
isGestureDetectorDisabled: true,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
return const SizedBox.shrink();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue