Surface framework initialization state on UI

This commit is contained in:
vishnukvmd 2024-01-11 19:19:58 +05:30
parent d79ad9f02d
commit e0d50ba55e
6 changed files with 64 additions and 18 deletions

View file

@ -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":

View file

@ -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(

View file

@ -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",

View file

@ -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 {

View file

@ -150,8 +150,8 @@ class SemanticSearchService {
);
}
Future<bool> getFrameworkInitializationStatus() {
return _frameworkInitialization.future;
InitializationState getFrameworkInitializationState() {
return _mlFramework.initializationState;
}
Future<void> clearIndexes() async {

View file

@ -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 {