-
Notifications
You must be signed in to change notification settings - Fork 121
[Application Passwords] Add experimental feature toggle in app settings #16059
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
RafaelKayumov
merged 18 commits into
trunk
from
WOOMOB-1189-add-application-passwords-feature-toggle
Sep 3, 2025
Merged
Changes from all commits
Commits
Show all changes
18 commits
Select commit
Hold shift + click to select a range
00c7fef
Draft application passwords feature toggle
RafaelKayumov e82a95b
Add feature async availability checker stub
RafaelKayumov e5f2034
Cache remote FF state in user defaults
RafaelKayumov 30a6663
Use app setting instead of feature flag
RafaelKayumov 94e35f0
Check both experiment availability and enabled state
RafaelKayumov 64ebccc
Observe app passwords experiment setting state
RafaelKayumov 409fde3
Delete extra value prepend for defaultSite
RafaelKayumov 5fd10d6
Fix methods description comments
RafaelKayumov b4a3deb
Add link for Application Passwords toggle description
RafaelKayumov 5d2c609
Update release notes
RafaelKayumov 3709103
Update tests
RafaelKayumov 9194cd4
Fix unused code
RafaelKayumov b432ac3
Add tests for `ApplicationPasswordsExperimentState`
RafaelKayumov 9026d48
Undo the release note
RafaelKayumov 4c6321a
Remove redundant VStack from section footer
RafaelKayumov a085407
Reset cached applicationPasswordsExperimentRemoteFFValue on session r…
RafaelKayumov 2db13bc
Merge branch 'trunk' into WOOMOB-1189-add-application-passwords-featu…
RafaelKayumov 021e0d4
Delete unused constant
RafaelKayumov File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
70 changes: 70 additions & 0 deletions
70
...es/ViewRelated/Dashboard/Settings/Beta features/ApplicationPasswordsExperimentState.swift
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,70 @@ | ||
| import Foundation | ||
| import Yosemite | ||
|
|
||
| final class ApplicationPasswordsExperimentState { | ||
| private let stores: StoresManager | ||
| private let availabilityChecker: ApplicationPasswordsExperimentAvailabilityCheckerProtocol | ||
|
|
||
| init( | ||
| stores: StoresManager = ServiceLocator.stores, | ||
| availabilityChecker: ApplicationPasswordsExperimentAvailabilityCheckerProtocol = ApplicationPasswordsExperimentAvailabilityChecker() | ||
| ) { | ||
| self.stores = stores | ||
| self.availabilityChecker = availabilityChecker | ||
| } | ||
|
|
||
| var isAvailableAndEnabled: Bool { | ||
| get async { | ||
| let isAvailable = await availabilityChecker.fetchAvailability() | ||
| let isEnabled = await isEnabled | ||
| return isAvailable && isEnabled | ||
| } | ||
| } | ||
|
|
||
| @MainActor | ||
| private var isEnabled: Bool { | ||
| get async { | ||
| return await withCheckedContinuation { continuation in | ||
| stores.dispatch( | ||
| AppSettingsAction.getAppPasswordsExperimentSettingState { isOn in | ||
| continuation.resume(with: .success(isOn)) | ||
| } | ||
| ) | ||
| } | ||
| } | ||
| } | ||
| } | ||
|
|
||
| protocol ApplicationPasswordsExperimentAvailabilityCheckerProtocol { | ||
| var cachedValue: Bool { get } | ||
| func fetchAvailability() async -> Bool | ||
| } | ||
|
|
||
| final class ApplicationPasswordsExperimentAvailabilityChecker: ApplicationPasswordsExperimentAvailabilityCheckerProtocol { | ||
| private let userDefaults: UserDefaults | ||
|
|
||
| init(userDefaults: UserDefaults = .standard) { | ||
| self.userDefaults = userDefaults | ||
| } | ||
|
|
||
| var cachedValue: Bool { | ||
| get { | ||
| userDefaults[.applicationPasswordsExperimentRemoteFFValue] ?? false | ||
| } set { | ||
| userDefaults[.applicationPasswordsExperimentRemoteFFValue] = newValue | ||
| } | ||
| } | ||
|
|
||
| func fetchAvailability() async -> Bool { | ||
| await withCheckedContinuation { continuation in | ||
| //TODO: - put the remote FF checking here | ||
| let mockResultValue = true | ||
|
|
||
| DispatchQueue.main.asyncAfter(deadline: .now() + 3) { | ||
| continuation.resume(returning: mockResultValue) | ||
| } | ||
|
|
||
| cachedValue = mockResultValue | ||
| } | ||
| } | ||
| } |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Another suggestion: should we clear this flag in
SessionManager.reset?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done in a085407