consolidating language constants and using for unknown detection instance

pull/1384/head
William Jordan-Cooley 1 year ago
parent 933ec9b2ad
commit ffbc62ba55

@ -3,7 +3,7 @@ import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart';
import 'package:fluffychat/pangea/choreographer/widgets/it_bar.dart'; import 'package:fluffychat/pangea/choreographer/widgets/it_bar.dart';
import 'package:fluffychat/pangea/choreographer/widgets/send_button.dart'; import 'package:fluffychat/pangea/choreographer/widgets/send_button.dart';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';

@ -5,13 +5,12 @@ import 'package:fluffychat/pages/chat/chat.dart';
import 'package:fluffychat/pangea/choreographer/controllers/alternative_translator.dart'; import 'package:fluffychat/pangea/choreographer/controllers/alternative_translator.dart';
import 'package:fluffychat/pangea/choreographer/controllers/igc_controller.dart'; import 'package:fluffychat/pangea/choreographer/controllers/igc_controller.dart';
import 'package:fluffychat/pangea/choreographer/controllers/message_options.dart'; import 'package:fluffychat/pangea/choreographer/controllers/message_options.dart';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/controllers/subscription_controller.dart'; import 'package:fluffychat/pangea/controllers/subscription_controller.dart';
import 'package:fluffychat/pangea/enum/assistance_state_enum.dart'; import 'package:fluffychat/pangea/enum/assistance_state_enum.dart';
import 'package:fluffychat/pangea/enum/edit_type.dart'; import 'package:fluffychat/pangea/enum/edit_type.dart';
import 'package:fluffychat/pangea/models/it_step.dart'; import 'package:fluffychat/pangea/models/it_step.dart';
import 'package:fluffychat/pangea/models/language_detection_model.dart';
import 'package:fluffychat/pangea/models/representation_content_model.dart'; import 'package:fluffychat/pangea/models/representation_content_model.dart';
import 'package:fluffychat/pangea/models/space_model.dart'; import 'package:fluffychat/pangea/models/space_model.dart';
import 'package:fluffychat/pangea/models/tokens_event_content_model.dart'; import 'package:fluffychat/pangea/models/tokens_event_content_model.dart';
@ -94,63 +93,67 @@ class Choreographer {
} }
Future<void> _sendWithIGC(BuildContext context) async { Future<void> _sendWithIGC(BuildContext context) async {
if (igc.canSendMessage) { if (!igc.canSendMessage) {
final PangeaRepresentation? originalWritten = igc.showFirstMatch(context);
choreoRecord.includedIT && itController.sourceText != null return;
? PangeaRepresentation( }
langCode: l1LangCode ?? LanguageKeys.unknownLanguage,
text: itController.sourceText!, final PangeaRepresentation? originalWritten =
originalWritten: true, choreoRecord.includedIT && itController.sourceText != null
originalSent: false, ? PangeaRepresentation(
) langCode: l1LangCode ?? LanguageKeys.unknownLanguage,
: null; text: itController.sourceText!,
originalWritten: true,
final PangeaRepresentation originalSent = PangeaRepresentation( originalSent: false,
langCode: langCodeOfCurrentText ?? LanguageKeys.unknownLanguage, )
text: currentText, : null;
originalSent: true, //TODO - confirm that IT is indeed making sure the message is in the user's L1
originalWritten: originalWritten == null,
); // if the message has not been processed to determine its language
final ChoreoRecord? applicableChoreo = // then run it through the language detection endpoint. If the detection
isITandIGCEnabled && igc.igcTextData != null ? choreoRecord : null; // confidence is high enough, use that language code as the message's language
// to save that pangea representation
// if the message has not been processed to determine its language // TODO - move this to somewhere such that the message can be cleared from the input field
// then run it through the language detection endpoint. If the detection // before the language detection is complete. Otherwise, user is going to be waiting
// confidence is high enough, use that language code as the message's language // in cases of slow internet or slow language detection
// to save that pangea representation final String originalSentLangCode = langCodeOfCurrentText ??
if (applicableChoreo == null) { (await pangeaController.languageDetection.detectLanguage(
final resp = await pangeaController.languageDetection.detectLanguage(
currentText, currentText,
pangeaController.languageController.userL2?.langCode, pangeaController.languageController.userL2?.langCode,
pangeaController.languageController.userL1?.langCode, pangeaController.languageController.userL1?.langCode,
); ))
final LanguageDetection? bestDetection = resp.bestDetection(); .bestDetection()
if (bestDetection != null) { .langCode;
originalSent.langCode = bestDetection.langCode;
} final PangeaRepresentation originalSent = PangeaRepresentation(
} langCode: originalSentLangCode,
text: currentText,
originalSent: true,
originalWritten: originalWritten == null,
);
final UseType useType = useTypeCalculator(applicableChoreo); // TODO - why does both it and igc need to be enabled for choreo to be applicable?
debugPrint("use type in choreographer $useType"); final ChoreoRecord? applicableChoreo =
isITandIGCEnabled && igc.igcTextData != null ? choreoRecord : null;
chatController.send(
// PTODO - turn this back on in conjunction with saving tokens final UseType useType = useTypeCalculator(applicableChoreo);
// we need to save those tokens as well, in order for exchanges to work debugPrint("use type in choreographer $useType");
// properly. in an exchange, the other user will want
// originalWritten: originalWritten, chatController.send(
originalSent: originalSent, // PTODO - turn this back on in conjunction with saving tokens
tokensSent: igc.igcTextData?.tokens != null // we need to save those tokens as well, in order for exchanges to work
? PangeaMessageTokens(tokens: igc.igcTextData!.tokens) // properly. in an exchange, the other user will want
: null, // originalWritten: originalWritten,
//TODO - save originalwritten tokens originalSent: originalSent,
choreo: applicableChoreo, tokensSent: igc.igcTextData?.tokens != null
useType: useType, ? PangeaMessageTokens(tokens: igc.igcTextData!.tokens)
); : null,
//TODO - save originalwritten tokens
choreo: applicableChoreo,
useType: useType,
);
clear(); clear();
} else {
igc.showFirstMatch(context);
}
} }
_resetDebounceTimer() { _resetDebounceTimer() {
@ -481,10 +484,17 @@ class Choreographer {
bool get editTypeIsKeyboard => EditType.keyboard == _textController.editType; bool get editTypeIsKeyboard => EditType.keyboard == _textController.editType;
/// If there is applicable igcTextData, return the detected langCode
/// Otherwise, if the IT controller is open, return the user's L2 langCode
/// This second piece assumes that IT is being used to translate into the user's L2
/// and could be spotty. It's a bit of a hack, and should be tested more.
String? get langCodeOfCurrentText { String? get langCodeOfCurrentText {
if (igc.detectedLangCode != null) return igc.detectedLangCode!; if (igc.detectedLangCode != null) return igc.detectedLangCode!;
if (itController.isOpen) return l2LangCode!; // TODO - this is a bit of a hack, and should be tested more
// we should also check that user has not done customInput
if (itController.completedITSteps.isNotEmpty && itController.allCorrect)
return l2LangCode!;
return null; return null;
} }

@ -340,9 +340,6 @@ class ITController {
bool get isLoading => choreographer.isFetching; bool get isLoading => choreographer.isFetching;
bool get correctChoicesSelected =>
completedITSteps.every((ITStep step) => step.isCorrect);
String latestChoiceFeedback(BuildContext context) => String latestChoiceFeedback(BuildContext context) =>
completedITSteps.isNotEmpty completedITSteps.isNotEmpty
? completedITSteps.last.choiceFeedback(context) ? completedITSteps.last.choiceFeedback(context)

@ -1,7 +1,7 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart'; import 'package:fluffychat/pangea/choreographer/controllers/choreographer.dart';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/models/language_model.dart';
import 'package:fluffychat/pangea/utils/firebase_analytics.dart'; import 'package:fluffychat/pangea/utils/firebase_analytics.dart';

@ -1,4 +0,0 @@
class PrefKey {
static const lastFetched = 'LAST_FETCHED';
static const flags = 'flags';
}

@ -0,0 +1,24 @@
import 'package:fluffychat/pangea/models/language_detection_model.dart';
class LanguageKeys {
static const unknownLanguage = "unk";
static const mixedLanguage = "mixed";
static const defaultLanguage = "en";
static const multiLanguage = "multi";
}
class LanguageLevelType {
static List<int> get allInts => [0, 1, 2, 3, 4, 5, 6];
}
class PrefKey {
static const lastFetched = 'p_lang_lastfetched';
static const flags = 'p_lang_flag';
}
final LanguageDetection unknownLanguageDetection = LanguageDetection(
langCode: LanguageKeys.unknownLanguage,
confidence: 0.5,
);
const double languageDetectionConfidenceThreshold = 0.95;

@ -1,6 +0,0 @@
class LanguageKeys {
static const unknownLanguage = "unk";
static const mixedLanguage = "mixed";
static const defaultLanguage = "en";
static const multiLanguage = "multi";
}

@ -1,3 +0,0 @@
class LanguageLevelType {
static List<int> get allInts => [0, 1, 2, 3, 4, 5, 6];
}

@ -1,4 +0,0 @@
class PrefKey {
static const lastFetched = 'p_lang_lastfetched';
static const flags = 'p_lang_flag';
}

@ -1,6 +1,6 @@
import 'dart:developer'; import 'dart:developer';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/controllers/language_list_controller.dart';
import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/models/language_model.dart';

@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:fluffychat/pangea/config/environment.dart'; import 'package:fluffychat/pangea/config/environment.dart';
import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/models/language_detection_model.dart'; import 'package:fluffychat/pangea/models/language_detection_model.dart';
import 'package:fluffychat/pangea/network/urls.dart'; import 'package:fluffychat/pangea/network/urls.dart';
@ -75,19 +76,16 @@ class LanguageDetectionResponse {
}; };
} }
LanguageDetection? get _bestDetection { LanguageDetection get _bestDetection {
detections.sort((a, b) => b.confidence.compareTo(a.confidence)); detections.sort((a, b) => b.confidence.compareTo(a.confidence));
return detections.isNotEmpty ? detections.first : null; return detections.firstOrNull ?? unknownLanguageDetection;
} }
final double _confidenceThreshold = 0.95; LanguageDetection bestDetection({double? threshold}) =>
_bestDetection.confidence >=
LanguageDetection? bestDetection({double? threshold}) { (threshold ?? languageDetectionConfidenceThreshold)
threshold ??= _confidenceThreshold; ? _bestDetection
return (_bestDetection?.confidence ?? 0) >= _confidenceThreshold : unknownLanguageDetection;
? _bestDetection!
: null;
}
} }
class _LanguageDetectionCacheItem { class _LanguageDetectionCacheItem {

@ -1,13 +1,12 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/models/language_model.dart';
import 'package:fluffychat/pangea/repo/language_repo.dart'; import 'package:fluffychat/pangea/repo/language_repo.dart';
import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import '../constants/language_list_keys.dart';
import '../utils/shared_prefs.dart'; import '../utils/shared_prefs.dart';
class PangeaLanguage { class PangeaLanguage {

@ -1,7 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/constants/local.key.dart'; import 'package:fluffychat/pangea/constants/local.key.dart';
import 'package:fluffychat/pangea/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/constants/pangea_event_types.dart';
import 'package:fluffychat/pangea/controllers/base_controller.dart'; import 'package:fluffychat/pangea/controllers/base_controller.dart';

@ -1,7 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart';
import 'package:fluffychat/pangea/controllers/base_controller.dart'; import 'package:fluffychat/pangea/controllers/base_controller.dart';
import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart';

@ -1,7 +1,7 @@
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/repo/word_repo.dart'; import 'package:fluffychat/pangea/repo/word_repo.dart';
import '../models/word_data_model.dart'; import '../models/word_data_model.dart';
import 'base_controller.dart'; import 'base_controller.dart';

@ -4,7 +4,7 @@ import 'dart:developer';
import 'package:adaptive_dialog/adaptive_dialog.dart'; import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:fluffychat/pangea/constants/class_default_values.dart'; import 'package:fluffychat/pangea/constants/class_default_values.dart';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart';
import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart';
import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/controllers/language_list_controller.dart';

@ -22,7 +22,7 @@ import 'package:matrix/matrix.dart';
import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/sentry_flutter.dart';
import '../../widgets/matrix.dart'; import '../../widgets/matrix.dart';
import '../constants/language_keys.dart'; import '../constants/language_constants.dart';
import '../constants/pangea_event_types.dart'; import '../constants/pangea_event_types.dart';
import '../enum/use_type.dart'; import '../enum/use_type.dart';
import '../utils/error_handler.dart'; import '../utils/error_handler.dart';

@ -12,7 +12,7 @@ import 'package:matrix/src/utils/markdown.dart';
import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/sentry_flutter.dart';
import '../../widgets/matrix.dart'; import '../../widgets/matrix.dart';
import '../constants/language_keys.dart'; import '../constants/language_constants.dart';
import '../constants/pangea_event_types.dart'; import '../constants/pangea_event_types.dart';
import '../models/choreo_record.dart'; import '../models/choreo_record.dart';
import '../models/representation_content_model.dart'; import '../models/representation_content_model.dart';

@ -1,6 +1,6 @@
import 'dart:developer'; import 'dart:developer';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';

@ -7,7 +7,7 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import '../constants/class_default_values.dart'; import '../constants/class_default_values.dart';
import '../constants/language_keys.dart'; import '../constants/language_constants.dart';
import '../constants/pangea_event_types.dart'; import '../constants/pangea_event_types.dart';
import 'language_model.dart'; import 'language_model.dart';

@ -9,7 +9,7 @@ import 'package:fluffychat/pangea/utils/instructions.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import '../constants/language_keys.dart'; import '../constants/language_constants.dart';
import 'language_model.dart'; import 'language_model.dart';
PUserModel pUserModelFromJson(String str) => PUserModel pUserModelFromJson(String str) =>

@ -1,7 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer'; import 'dart:developer';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/controllers/language_list_controller.dart';
import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart'; import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart';
import 'package:fluffychat/pangea/extensions/client_extension/client_extension.dart'; import 'package:fluffychat/pangea/extensions/client_extension/client_extension.dart';

@ -1,5 +1,5 @@
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/constants/model_keys.dart'; import 'package:fluffychat/pangea/constants/model_keys.dart';
import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart'; import 'package:fluffychat/pangea/matrix_event_wrappers/pangea_message_event.dart';

@ -1,6 +1,6 @@
import 'dart:developer'; import 'dart:developer';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/controllers/contextual_definition_controller.dart'; import 'package:fluffychat/pangea/controllers/contextual_definition_controller.dart';
import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/models/language_model.dart';

@ -1,4 +1,4 @@
import 'package:fluffychat/pangea/constants/language_level_type.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/utils/language_level_copy.dart'; import 'package:fluffychat/pangea/utils/language_level_copy.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';

@ -1,6 +1,6 @@
import 'dart:developer'; import 'dart:developer';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/controllers/language_list_controller.dart'; import 'package:fluffychat/pangea/controllers/language_list_controller.dart';
import 'package:fluffychat/pangea/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/controllers/pangea_controller.dart';
import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/models/language_model.dart';

@ -24,7 +24,7 @@ import 'dart:io';
import 'package:fcm_shared_isolate/fcm_shared_isolate.dart'; import 'package:fcm_shared_isolate/fcm_shared_isolate.dart';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:fluffychat/pangea/constants/language_keys.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/utils/error_handler.dart'; import 'package:fluffychat/pangea/utils/error_handler.dart';
import 'package:fluffychat/utils/push_helper.dart'; import 'package:fluffychat/utils/push_helper.dart';
import 'package:fluffychat/widgets/fluffy_chat_app.dart'; import 'package:fluffychat/widgets/fluffy_chat_app.dart';

Loading…
Cancel
Save