1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-21 10:43:35 +00:00

[PM-22758] Configurable Keyboard Shortcut for Autotype (#16613)

* [PM-22785] Initial push with configuration and ipc changes for the configurable autotype keyboard shortcut

* [PM-22785] Add messy code with working configurable hotkey

* [PM-22785] Add more messy rust code

* [PM-22785] Add temp changes with configurable hotkey ui

* Add shortcut display to settings

* [PM-22785] Logic updates. Ran npm run prettier and lint:fix.

* [PM-22785] Add back disableAutotype with refactors.

* [PM-22785] Clean up Rust code

* [PM-22785] Clean up Rust code v2

* [PM-22785] Add unicode bounds in Rust code

* [PM-22785] Update rust code comments

* [PM-22785] Add unicode_value byte length check post-encoding

* [PM-22785] Extract encoding to a separate function

* Various fixes for the autotype setting label

* Misc component fixes

* Disallow nunmbers and allow Win key

* Themify edit shortcut

* Change display of Super to Win

* Create autotype format method

* Autotpe modal cleanup

* [PM-22785] Some cleanup

* Add unit tests and adjust error handling

* [PM-22785] Fix build issues on Mac and Linux

* [PM-22785] Linting fix

* Remove unused message

* [PM-22785] Linting fix

* [PM-22785] More linting fix

* [PM-22785] Address initial PR comments

* [PM-22785] Comment change

* [PM-22785] If statement change

* [PM-22785] Update with fixes from PR comments

* [PM-22785] Update with fixes from PR comments version ?

* add unit tests for get_alphabetic_hot_key()

* Fix tests

* Add missing mock to tests

* [PM-22785] Update with small fixes via PR comments

---------

Co-authored-by: Robyn MacCallum <robyntmaccallum@gmail.com>
Co-authored-by: neuronull <9162534+neuronull@users.noreply.github.com>
This commit is contained in:
Colton Hurst
2025-09-29 10:20:15 -04:00
committed by GitHub
parent 018b4d5eb4
commit fc53eae4c5
18 changed files with 802 additions and 50 deletions

View File

@@ -58,6 +58,7 @@ import { KeyService, BiometricStateService, BiometricsStatus } from "@bitwarden/
import { PermitCipherDetailsPopoverComponent } from "@bitwarden/vault";
import { SetPinComponent } from "../../auth/components/set-pin.component";
import { AutotypeShortcutComponent } from "../../autofill/components/autotype-shortcut.component";
import { SshAgentPromptType } from "../../autofill/models/ssh-agent-setting";
import { DesktopAutofillSettingsService } from "../../autofill/services/desktop-autofill-settings.service";
import { DesktopAutotypeService } from "../../autofill/services/desktop-autotype.service";
@@ -111,6 +112,7 @@ export class SettingsComponent implements OnInit, OnDestroy {
requireEnableTray = false;
showDuckDuckGoIntegrationOption = false;
showEnableAutotype = false;
autotypeShortcut: string;
showOpenAtLoginOption = false;
isWindows: boolean;
isLinux: boolean;
@@ -173,6 +175,7 @@ export class SettingsComponent implements OnInit, OnDestroy {
value: false,
disabled: true,
}),
autotypeShortcut: [null as string | null],
theme: [null as Theme | null],
locale: [null as string | null],
});
@@ -397,6 +400,9 @@ export class SettingsComponent implements OnInit, OnDestroy {
),
allowScreenshots: !(await firstValueFrom(this.desktopSettingsService.preventScreenshots$)),
enableAutotype: await firstValueFrom(this.desktopAutotypeService.autotypeEnabledUserSetting$),
autotypeShortcut: this.getFormattedAutotypeShortcutText(
(await firstValueFrom(this.desktopAutotypeService.autotypeKeyboardShortcut$)) ?? [],
),
theme: await firstValueFrom(this.themeStateService.selectedTheme$),
locale: await firstValueFrom(this.i18nService.userSetLocale$),
};
@@ -897,6 +903,29 @@ export class SettingsComponent implements OnInit, OnDestroy {
async saveEnableAutotype() {
await this.desktopAutotypeService.setAutotypeEnabledState(this.form.value.enableAutotype);
const currentShortcut = await firstValueFrom(
this.desktopAutotypeService.autotypeKeyboardShortcut$,
);
if (currentShortcut) {
this.form.controls.autotypeShortcut.setValue(
this.getFormattedAutotypeShortcutText(currentShortcut),
);
}
}
async saveAutotypeShortcut() {
const dialogRef = AutotypeShortcutComponent.open(this.dialogService);
const newShortcutArray = await firstValueFrom(dialogRef.closed);
if (!newShortcutArray) {
return;
}
this.form.controls.autotypeShortcut.setValue(
this.getFormattedAutotypeShortcutText(newShortcutArray),
);
await this.desktopAutotypeService.setAutotypeKeyboardShortcutState(newShortcutArray);
}
private async generateVaultTimeoutOptions(): Promise<VaultTimeoutOption[]> {
@@ -944,4 +973,8 @@ export class SettingsComponent implements OnInit, OnDestroy {
throw new Error("Unsupported platform");
}
}
getFormattedAutotypeShortcutText(shortcut: string[]) {
return shortcut ? shortcut.join("+").replace("Super", "Win") : null;
}
}