Skip to content

Commit

Permalink
Merge pull request #627 from d-loose/gsettings-input-source
Browse files Browse the repository at this point in the history
feat(bootstrap): set input source directly
  • Loading branch information
d-loose authored and GitHub Actions committed Apr 11, 2024
2 parents ee025ba + b5fafa6 commit 10c7ce0
Show file tree
Hide file tree
Showing 10 changed files with 503 additions and 314 deletions.
35 changes: 33 additions & 2 deletions packages/ubuntu_bootstrap/lib/services/keyboard_service.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,22 @@
import 'package:dbus/dbus.dart';
import 'package:gsettings/gsettings.dart';
import 'package:meta/meta.dart';
import 'package:subiquity_client/subiquity_client.dart';
import 'package:ubuntu_bootstrap/ubuntu_bootstrap.dart';
import 'package:ubuntu_logger/ubuntu_logger.dart';
import 'package:ubuntu_provision/services.dart';

final _log = Logger('keyboard_service');

class SubiquityKeyboardService implements KeyboardService {
const SubiquityKeyboardService(this._subiquity);
SubiquityKeyboardService(
this._subiquity, {
@visibleForTesting GSettings? inputSourceSettings,
}) : _inputSourceSettings = inputSourceSettings ??
createService<GSettings, String>('org.gnome.desktop.input-sources');

final SubiquityClient _subiquity;
final GSettings _inputSourceSettings;

@override
Future<KeyboardSetup> getKeyboard() => _subiquity.getKeyboard();
Expand All @@ -15,7 +27,8 @@ class SubiquityKeyboardService implements KeyboardService {
}

@override
Future<void> setInputSource(KeyboardSetting setting, {String? user}) {
Future<void> setInputSource(KeyboardSetting setting, {String? user}) async {
await _setGsettingsInputSource(setting);
return _subiquity.setInputSource(setting, user: user);
}

Expand All @@ -26,4 +39,22 @@ class SubiquityKeyboardService implements KeyboardService {

@override
bool get canDetectLayout => true;

Future<void> _setGsettingsInputSource(KeyboardSetting setting) async {
try {
final xkbString = setting.variant.isNotEmpty
? '${setting.layout}+${setting.variant}'
: setting.layout;
await _inputSourceSettings.set(
'sources',
DBusArray(
DBusSignature.struct([DBusSignature.string, DBusSignature.string]),
[
DBusStruct([const DBusString('xkb'), DBusString(xkbString)])
]),
);
} on Exception catch (e) {
_log.error('Failed to set input source via gsettings', e);
}
}
}
7 changes: 6 additions & 1 deletion packages/ubuntu_bootstrap/test/installer_wizard_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,12 @@ extension on WidgetTester {
registerMockService<SessionService>(
SubiquitySessionService(subiquityClient),
);
final keyboardService = SubiquityKeyboardService(subiquityClient);
final inputSettings = MockGSettings();
when(inputSettings.set(any, any)).thenAnswer((_) async {});
final keyboardService = SubiquityKeyboardService(
subiquityClient,
inputSourceSettings: inputSettings,
);
registerMockService<KeyboardService>(keyboardService);
when(keyboardService.getKeyboard()).thenAnswer((_) async => keyboardSetup);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
import 'package:dbus/dbus.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:gsettings/gsettings.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:ubuntu_bootstrap/services.dart';

import 'gnome_accessibility_service_test.mocks.dart';
import '../test_utils.dart';

@GenerateMocks([GSettings])
void main() {
late MockGSettings a11yInterfaceSettings;
late MockGSettings applicationSettings;
Expand Down

This file was deleted.

41 changes: 37 additions & 4 deletions packages/ubuntu_bootstrap/test/services/keyboard_service_test.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:dbus/dbus.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:subiquity_client/subiquity_client.dart';
Expand All @@ -7,11 +8,21 @@ import 'package:ubuntu_bootstrap/services/keyboard_service.dart';
import '../test_utils.dart';

void main() {
late MockGSettings inputSourceSettings;

setUp(() {
inputSourceSettings = MockGSettings();
when(inputSourceSettings.set(any, any)).thenAnswer((_) async {});
});

test('get keyboard', () async {
final client = MockSubiquityClient();
when(client.getKeyboard()).thenAnswer((_) async => keyboardSetup);

final service = SubiquityKeyboardService(client);
final service = SubiquityKeyboardService(
client,
inputSourceSettings: inputSourceSettings,
);
expect(await service.getKeyboard(), equals(keyboardSetup));

verify(client.getKeyboard()).called(1);
Expand All @@ -21,7 +32,10 @@ void main() {
final client = MockSubiquityClient();
when(client.setKeyboard(keyboardSetup.setting)).thenAnswer((_) async {});

final service = SubiquityKeyboardService(client);
final service = SubiquityKeyboardService(
client,
inputSourceSettings: inputSourceSettings,
);
await service.setKeyboard(keyboardSetup.setting);

verify(client.setKeyboard(keyboardSetup.setting)).called(1);
Expand All @@ -32,19 +46,38 @@ void main() {
when(client.setInputSource(keyboardSetup.setting, user: 'ubuntu'))
.thenAnswer((_) async {});

final service = SubiquityKeyboardService(client);
final service = SubiquityKeyboardService(
client,
inputSourceSettings: inputSourceSettings,
);
await service.setInputSource(keyboardSetup.setting, user: 'ubuntu');

verify(client.setInputSource(keyboardSetup.setting, user: 'ubuntu'))
.called(1);

verify(inputSourceSettings.set(
'sources',
DBusArray(
DBusSignature.struct([DBusSignature.string, DBusSignature.string]),
[
DBusStruct([
const DBusString('xkb'),
const DBusString('us+altgr-intl'),
])
],
),
)).called(1);
});

test('get keyboard step', () async {
final client = MockSubiquityClient();
when(client.getKeyboardStep(any)).thenAnswer(
(_) async => const AnyStep.stepPressKey(keycodes: {}, symbols: []));

final service = SubiquityKeyboardService(client);
final service = SubiquityKeyboardService(
client,
inputSourceSettings: inputSourceSettings,
);
await service.getKeyboardStep('1');

verify(client.getKeyboardStep('1')).called(1);
Expand Down
2 changes: 2 additions & 0 deletions packages/ubuntu_bootstrap/test/test_utils.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:gsettings/gsettings.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:ubuntu_bootstrap/installer/installation_step.dart';
Expand Down Expand Up @@ -53,6 +54,7 @@ extension WidgetTesterX on WidgetTester {
}

@GenerateMocks([
GSettings,
InstallerService,
PostInstallService,
RefreshService,
Expand Down

0 comments on commit 10c7ce0

Please sign in to comment.