Skip to content

Commit 21d6f65

Browse files
authored
Multi-lang STT service with users primary language (#2149)
#1892
2 parents b46f5c6 + 493ef75 commit 21d6f65

File tree

26 files changed

+924
-282
lines changed

26 files changed

+924
-282
lines changed

app/android/settings.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ plugins {
2222
// START: FlutterFire Configuration
2323
id "com.google.gms.google-services" version "4.3.15" apply false
2424
// END: FlutterFire Configuration
25-
id "org.jetbrains.kotlin.android" version "1.9.21" apply false
25+
id "org.jetbrains.kotlin.android" version "2.1.0" apply false
2626

2727

2828
}
2929

30-
include ":app"
30+
include ":app"

app/lib/backend/http/api/transcribe.dart

Lines changed: 0 additions & 40 deletions
This file was deleted.

app/lib/backend/http/api/users.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,3 +280,39 @@ Future<bool> getHasConversationSummaryRating(String conversationId) async {
280280
return false;
281281
}
282282
}
283+
284+
// User language preference API calls
285+
Future<String?> getUserPrimaryLanguage() async {
286+
var response = await makeApiCall(
287+
url: '${Env.apiBaseUrl}v1/users/language',
288+
headers: {},
289+
method: 'GET',
290+
body: '',
291+
);
292+
if (response == null) return null;
293+
debugPrint('getUserPrimaryLanguage response: ${response.body}');
294+
295+
try {
296+
var jsonResponse = jsonDecode(response.body);
297+
// Return null if language is null or empty
298+
if (jsonResponse['language'] == null || jsonResponse['language'] == '') {
299+
return null;
300+
}
301+
return jsonResponse['language'] as String?;
302+
} catch (e) {
303+
debugPrint('Error parsing getUserPrimaryLanguage response: $e');
304+
return null;
305+
}
306+
}
307+
308+
Future<bool> setUserPrimaryLanguage(String languageCode) async {
309+
var response = await makeApiCall(
310+
url: '${Env.apiBaseUrl}v1/users/language',
311+
headers: {},
312+
method: 'PATCH',
313+
body: jsonEncode({'language': languageCode}),
314+
);
315+
if (response == null) return false;
316+
debugPrint('setUserPrimaryLanguage response: ${response.body}');
317+
return response.statusCode == 200;
318+
}

app/lib/backend/preferences.dart

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,6 @@ class SharedPreferencesUtil {
157157

158158
set showFirmwareUpdateDialog(bool value) => saveBool('v2/showFirmwareUpdateDialog', value);
159159

160-
String get recordingsLanguage => getString('recordingsLanguage2') ?? 'auto';
161-
162-
set recordingsLanguage(String value) => saveString('recordingsLanguage2', value);
163-
164160
String get transcriptionModel => getString('transcriptionModel3') ?? 'soniox';
165161

166162
set transcriptionModel(String value) => saveString('transcriptionModel3', value);
@@ -197,6 +193,15 @@ class SharedPreferencesUtil {
197193

198194
set showDiscardedMemories(bool value) => saveBool('showDiscardedMemories', value);
199195

196+
// User primary language preferences
197+
String get userPrimaryLanguage => getString('userPrimaryLanguage') ?? '';
198+
199+
set userPrimaryLanguage(String value) => saveString('userPrimaryLanguage', value);
200+
201+
bool get hasSetPrimaryLanguage => getBool('hasSetPrimaryLanguage') ?? false;
202+
203+
set hasSetPrimaryLanguage(bool value) => saveBool('hasSetPrimaryLanguage', value);
204+
200205
int get currentStorageBytes => getInt('currentStorageBytes') ?? 0;
201206

202207
set currentStorageBytes(int value) => saveInt('currentStorageBytes', value);
@@ -456,6 +461,12 @@ class SharedPreferencesUtil {
456461
await remove('calendarId');
457462
await remove('calendarType2');
458463

464+
// User Primary language
465+
await remove('userPrimaryLanguage');
466+
await remove('hasSetPrimaryLanguage');
467+
468+
await remove('onboardingCompleted');
469+
459470
// Keep settings like language, analytics opt-in, etc.
460471
// as these are user preferences that should persist across logins
461472
}

app/lib/main.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ class _DeciderWidgetState extends State<DeciderWidget> {
339339

340340
if (context.read<AuthenticationProvider>().isSignedIn()) {
341341
context.read<HomeProvider>().setupHasSpeakerProfile();
342+
context.read<HomeProvider>().setupUserPrimaryLanguage();
342343
try {
343344
await IntercomManager.instance.intercom.loginIdentifiedUser(
344345
userId: SharedPreferencesUtil().uid,

app/lib/pages/home/page.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver, Ticker
157157
@override
158158
void initState() {
159159
SharedPreferencesUtil().onboardingCompleted = true;
160-
160+
161161
// Navigate uri
162162
Uri? navigateToUri;
163163
var pageAlias = "home";

app/lib/pages/home/widgets/speech_language_sheet.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class SpeechLanguageSheet extends StatelessWidget {
113113
),
114114
const SizedBox(width: 4),
115115
Text(
116-
SharedPreferencesUtil().recordingsLanguage.toUpperCase(),
116+
SharedPreferencesUtil().userPrimaryLanguage.toUpperCase(),
117117
style: const TextStyle(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
118118
),
119119
],

app/lib/pages/onboarding/name/name_widget.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import 'package:omi/backend/auth.dart';
33
import 'package:omi/backend/preferences.dart';
44
import 'package:gradient_borders/gradient_borders.dart';
55
import 'package:intercom_flutter/intercom_flutter.dart';
6+
import 'package:omi/providers/home_provider.dart';
7+
import 'package:provider/provider.dart';
68

79
class NameWidget extends StatefulWidget {
810
final Function goNext;
@@ -24,6 +26,7 @@ class _NameWidgetState extends State<NameWidget> {
2426
super.initState();
2527
}
2628

29+
2730
@override
2831
Widget build(BuildContext context) {
2932
return Padding(

0 commit comments

Comments
 (0)