Surface framework initialization state on UI
This commit is contained in:
parent
d79ad9f02d
commit
e0d50ba55e
2
lib/generated/intl/messages_en.dart
generated
2
lib/generated/intl/messages_en.dart
generated
|
@ -1451,6 +1451,8 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||
"viewer": MessageLookupByLibrary.simpleMessage("Viewer"),
|
||||
"visitWebToManage": MessageLookupByLibrary.simpleMessage(
|
||||
"Please visit web.ente.io to manage your subscription"),
|
||||
"waitingForWifi":
|
||||
MessageLookupByLibrary.simpleMessage("Waiting for WiFi..."),
|
||||
"weAreOpenSource":
|
||||
MessageLookupByLibrary.simpleMessage("We are open source!"),
|
||||
"weDontSupportEditingPhotosAndAlbumsThatYouDont":
|
||||
|
|
10
lib/generated/l10n.dart
generated
10
lib/generated/l10n.dart
generated
|
@ -2886,6 +2886,16 @@ class S {
|
|||
);
|
||||
}
|
||||
|
||||
/// `Waiting for WiFi...`
|
||||
String get waitingForWifi {
|
||||
return Intl.message(
|
||||
'Waiting for WiFi...',
|
||||
name: 'waitingForWifi',
|
||||
desc: '',
|
||||
args: [],
|
||||
);
|
||||
}
|
||||
|
||||
/// `Status`
|
||||
String get status {
|
||||
return Intl.message(
|
||||
|
|
|
@ -410,6 +410,7 @@
|
|||
"magicSearch": "Magic search",
|
||||
"magicSearchDescription": "Please note that this will result in a higher bandwidth and battery usage until all items are indexed.",
|
||||
"loadingModel": "Downloading models...",
|
||||
"waitingForWifi": "Waiting for WiFi...",
|
||||
"status": "Status",
|
||||
"indexedItems": "Indexed items",
|
||||
"pendingItems": "Pending items",
|
||||
|
|
|
@ -38,7 +38,7 @@ abstract class MLFramework {
|
|||
InitializationState get initializationState => _state;
|
||||
|
||||
set _initState(InitializationState state) {
|
||||
Bus.instance.fire(MLFrameworkInitializationEvent(state));
|
||||
Bus.instance.fire(MLFrameworkInitializationUpdateEvent(state));
|
||||
_logger.info("Init state is $state");
|
||||
_state = state;
|
||||
}
|
||||
|
@ -192,10 +192,10 @@ abstract class MLFramework {
|
|||
}
|
||||
}
|
||||
|
||||
class MLFrameworkInitializationEvent extends Event {
|
||||
class MLFrameworkInitializationUpdateEvent extends Event {
|
||||
final InitializationState state;
|
||||
|
||||
MLFrameworkInitializationEvent(this.state);
|
||||
MLFrameworkInitializationUpdateEvent(this.state);
|
||||
}
|
||||
|
||||
enum InitializationState {
|
||||
|
|
|
@ -150,8 +150,8 @@ class SemanticSearchService {
|
|||
);
|
||||
}
|
||||
|
||||
Future<bool> getFrameworkInitializationStatus() {
|
||||
return _frameworkInitialization.future;
|
||||
InitializationState getFrameworkInitializationState() {
|
||||
return _mlFramework.initializationState;
|
||||
}
|
||||
|
||||
Future<void> clearIndexes() async {
|
||||
|
|
|
@ -6,6 +6,7 @@ import "package:photos/core/event_bus.dart";
|
|||
import 'package:photos/events/embedding_updated_event.dart';
|
||||
import "package:photos/generated/l10n.dart";
|
||||
import "package:photos/services/feature_flag_service.dart";
|
||||
import "package:photos/services/semantic_search/frameworks/ml_framework.dart";
|
||||
import "package:photos/services/semantic_search/semantic_search_service.dart";
|
||||
import "package:photos/theme/ente_theme.dart";
|
||||
import "package:photos/ui/common/loading_widget.dart";
|
||||
|
@ -29,6 +30,32 @@ class MachineLearningSettingsPage extends StatefulWidget {
|
|||
|
||||
class _MachineLearningSettingsPageState
|
||||
extends State<MachineLearningSettingsPage> {
|
||||
late InitializationState _state;
|
||||
|
||||
late StreamSubscription<MLFrameworkInitializationUpdateEvent>
|
||||
_eventSubscription;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_eventSubscription =
|
||||
Bus.instance.on<MLFrameworkInitializationUpdateEvent>().listen((event) {
|
||||
_fetchState();
|
||||
setState(() {});
|
||||
});
|
||||
_fetchState();
|
||||
}
|
||||
|
||||
void _fetchState() {
|
||||
_state = SemanticSearchService.instance.getFrameworkInitializationState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
_eventSubscription.cancel();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
|
@ -118,17 +145,9 @@ class _MachineLearningSettingsPageState
|
|||
hasEnabled
|
||||
? Column(
|
||||
children: [
|
||||
FutureBuilder(
|
||||
future: SemanticSearchService.instance
|
||||
.getFrameworkInitializationStatus(),
|
||||
builder: (BuildContext context, AsyncSnapshot snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
return const MagicSearchIndexStatsWidget();
|
||||
} else {
|
||||
return const ModelLoadingState();
|
||||
}
|
||||
},
|
||||
),
|
||||
_state == InitializationState.initialized
|
||||
? const MagicSearchIndexStatsWidget()
|
||||
: ModelLoadingState(_state),
|
||||
const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
|
@ -158,7 +177,12 @@ class _MachineLearningSettingsPageState
|
|||
}
|
||||
|
||||
class ModelLoadingState extends StatelessWidget {
|
||||
const ModelLoadingState({super.key});
|
||||
final InitializationState state;
|
||||
|
||||
const ModelLoadingState(
|
||||
this.state, {
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -167,7 +191,7 @@ class ModelLoadingState extends StatelessWidget {
|
|||
MenuSectionTitle(title: S.of(context).status),
|
||||
MenuItemWidget(
|
||||
captionedTextWidget: CaptionedTextWidget(
|
||||
title: S.of(context).loadingModel,
|
||||
title: _getTitle(context),
|
||||
),
|
||||
trailingWidget: EnteLoadingWidget(
|
||||
size: 12,
|
||||
|
@ -180,6 +204,15 @@ class ModelLoadingState extends StatelessWidget {
|
|||
],
|
||||
);
|
||||
}
|
||||
|
||||
String _getTitle(BuildContext context) {
|
||||
switch (state) {
|
||||
case InitializationState.waitingForNetwork:
|
||||
return S.of(context).waitingForWifi;
|
||||
default:
|
||||
return S.of(context).loadingModel;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class MagicSearchIndexStatsWidget extends StatefulWidget {
|
||||
|
|
Loading…
Reference in a new issue