Commit Graph

87 Commits

Author SHA1 Message Date
Davide De Rosa 4cb18965c9 Set duplicate as current inside ProfileManager
When setting duplicate as current, batch save original profile and
duplicate in a single call via profilesToSave. This is to avoid a
double call to willUpdateProfiles() when saving Core Data context.

In order to set current profile to one that has not been persisted
yet (the duplicate), we need to resort to a pendingProfiles map
where to look the duplicate up when setting currentProfileId.

Either way, iOS 14 cannot handle updating a "hot" change in a
presented NavigationLink. Changing currentProfileId binding while
in ProfileView messes up navigation completely (multiple push and
pop events). Avoid.
2022-05-03 18:35:19 +02:00
Davide De Rosa 943bce5515 Bind navigation to ProfileManager directly
- Do the profile loading inside the model

- Allow setting current profile to a transient profile

- Check .placeholder before saving current profile

XXX: avoid loading active profile on iPad portrait.
2022-05-03 18:35:17 +02:00
Davide De Rosa 7036ca5f41 Fix handling of non-ready profiles
- Omit title while isLoading, to not show former profile name

- Animate on isLoading
2022-05-03 15:54:19 +02:00
Davide De Rosa b9248cbb89 Animate profile removal
Fade into WelcomeView.
2022-05-03 15:44:47 +02:00
Davide De Rosa ca49d8bfc6 Increase vertical padding in profile rows 2022-05-03 15:43:55 +02:00
Davide De Rosa 8230666ab2 Only use wrapping Section to fix iPad multitasking 2022-05-03 15:43:15 +02:00
Davide De Rosa 3c0e511e84 Split again OrganizerView and ProfilesList
On iOS 14, Organizer scrolls abruptly on profile selection. It
looks like this was introduced by merging ProfilesList into
OrganizerView.

Try to revert merge to split observation responsibilities.

Drop unused AppManager in +Scene along the way.
2022-05-03 14:40:41 +02:00
Davide De Rosa 93abaf538b Simplify redundant parts of ProfileManager
- Drop overthought activeHeader

- Drop willUpdateCurrentProfile, use observable

- Drop willUpdateActiveId, observe value publisher
2022-05-03 14:36:55 +02:00
Davide De Rosa d3bd41b251 Do not blink circle while connected 2022-05-02 10:56:40 +02:00
Davide De Rosa cc681dfeab Refine profile icons and animate if connected
Assume 3 different profile states:

- Active and connected
- Active
- Inactive
2022-05-02 10:48:12 +02:00
Davide De Rosa 576eb1512a Fix slow active profile selection on launch
Regression due to missing .stack navigation style basically.

Restore .onAppear() on NavigationLink.
2022-05-02 09:53:18 +02:00
Davide De Rosa 472b5e4b41 Fix active profile flickering on first launch
Move .onAppear() handler to main view.
2022-05-01 20:16:05 +02:00
Davide De Rosa 3571c7db35 Reduce vertical padding in profile rows 2022-05-01 20:06:03 +02:00
Davide De Rosa 48d499569b Use block versions of Section header/footer 2022-05-01 19:48:24 +02:00
Davide De Rosa 171c1e1dd4 Omit wrapping Section on Mac 2022-05-01 19:30:56 +02:00
Davide De Rosa cfc0d4f572 Restore active profile on top
Flashing on activation was caused by VPNManager.disable() in
ProfileView+VPN, because by setting lastError to nil it would
notify a change to ProfileRow (via VPNStateView) during the
profile row activation animation. That caused the flicker.

Instead, disable VPN first, then start the animation.

Anyway, avoid clearing a nil lastError.
2022-05-01 19:19:43 +02:00
Davide De Rosa edc7cdf045 Merge List into OrganizerView
- Restore wrapping Section as it seems to fix multitasking

- Hide profiles section if empty
2022-05-01 19:19:31 +02:00
Davide De Rosa 8003b4a92d Observe currentProfile in ProfileView
ProfileView is not interested in changes in other profiles
notified by ProfileManager. Set isLoading inside
ObservableObject for observable to be self-contained.

Loses observation of profile deletion, but dismiss on removal is
actually handled by OrganizerView, not ProfileView.

Also drop unused presentationMode.
2022-05-01 19:14:34 +02:00
Davide De Rosa 9af67e12ce Drop profiles Section wrapper 2022-04-29 19:51:18 +02:00
Davide De Rosa 0047d095fb Adjust navigation style to all devices
- Mac
    - Drop all styles
    - Tweak hide title bar
    - Hide navigation bar

- Restore single section for all profiles
    - Allows using NavigationLink safely
    - Indirectly fixes multitasking
    - Retains selection on profile activation
    - Clean up presentActiveProfile

- Leave active profile in its position
    - Fixes Mac flashing row selection on profile activation

- Unify profile row appearance
    - Use fixed .headline font
    - Add subtitles to inactive profiles
    - Use padding rather than fixed row height

CAVEATS:

- Do not preselect active profile on iPad launch, as doing so
seems to present two ProfileView on top of each other, one from
MainView and one from the NavigationLink.

- Do not touch .listStyle() of master view, as it seems to break
navigation esp. in iPad multitasking.
2022-04-29 19:29:47 +02:00
Davide De Rosa 4d13d8bf6b Do not observe AppManager, just use for migrations 2022-04-29 18:58:07 +02:00
Davide De Rosa 2c2e794b00 Revert async loadCurrentProfile()
Make action sync, but internally async (makeProfileReady). If not
doing so, UI on launch will not be able to show active profile
immediately. WelcomeView would appear for a moment.

Observe isReloadingCurrentProfile.

See 2b1efb8fec
2022-04-28 19:00:36 +02:00
Davide De Rosa 03cb05da7e Do not disable providers while updating index 2022-04-27 23:08:46 +02:00
Davide De Rosa 2aa4008a08 Animate profile removal
Could only notice difference on iPad.
2022-04-27 18:32:44 +02:00
Davide De Rosa d4484f3307 Simplify layout of in-app products 2022-04-27 18:32:44 +02:00
Davide De Rosa 2b1efb8fec Make load*Profile() async
- Handle Task in consumers

- Drop makeReady, always make loaded profile ready

- Rename misleading loadProfile() to profileEx()
2022-04-27 17:13:03 +02:00
Davide De Rosa 02b2e3194e Add duplicate to profile menu
Contextually switch current profile to duplicate.
2022-04-27 16:59:33 +02:00
Davide De Rosa 496abc6c89 Move Siri on top of menu 2022-04-27 16:54:07 +02:00
Davide De Rosa 49a1f1b55c Address VPN toggle losing sync with internal state
- Update TunnelKit

- Receive TunnelKit notifications on main queue

- Bind VPN toggle to VPNManager directly (implicit animations)

- Update state on VPN didFail

- Set isEnabled = false after uninstalling VPN (not notified)
2022-04-27 15:53:31 +02:00
Davide De Rosa cd854f8ebf Group profile actions into menus
- Organizer
    - Duplicate

- Profile
    - Rename
    - Siri
    - Uninstall (+ confirmation)
    - Delete (+ confirmation)
2022-04-27 09:53:42 +02:00
Davide De Rosa 1c047b9ce2 Retain profile name (disabled) after importing
Works around a crash in iPadOS 14 portrait when removing section
containing first responder (profile name TextField). It happened
when submitting profile name via keyboard rather than "Save".
2022-04-26 22:56:41 +02:00
Davide De Rosa 4a0245d757 Rename AddHostView to .NameView
In preparation of future additions to flow.
2022-04-26 22:44:34 +02:00
Davide De Rosa 03fdab4833 Duplicate profile from context menu 2022-04-26 22:39:47 +02:00
Davide De Rosa 1ea380312a Update providers index on add provider appearance 2022-04-26 22:15:39 +02:00
Davide De Rosa 4b8cff1bb3 Disable padding around LongContentView
It should actually be an inset. Do it later.
2022-04-26 21:39:21 +02:00
Davide De Rosa 99e48119f7 Encapsulate calculation of former products
Use an interface (BuildProducts) that makes understandable and
easily extensibile how some in-app products are inferred by build
number.
2022-04-26 20:55:18 +02:00
Davide De Rosa f4714dec58 Fix VPN toggle enabling despite errors 2022-04-26 19:02:12 +02:00
Davide De Rosa 4973a19fda Drop unused method 2022-04-26 10:59:48 +02:00
Davide De Rosa 1ff19b331f Move VPNToggle to standalone view 2022-04-26 10:40:46 +02:00
Davide De Rosa ccde6a30cf Fix issues with VPN toggle
- Move rate limit to UI only

- Keep caption constant to "Enabled"
2022-04-25 23:12:45 +02:00
Davide De Rosa 58cf401883 Share prefix for validating theme methods 2022-04-25 22:44:24 +02:00
Davide De Rosa 5c0e053e7d Review requirements of DNS over TLS (DoT)
- Make DNS servers optional in TunnelKit

- Allow IP address as DoT server name
2022-04-25 22:40:09 +02:00
Davide De Rosa efb9760d6b Redo VPN toggle properly
- Use local @State for appearance

- On binding set, control VPNManager
2022-04-25 16:36:07 +02:00
Davide De Rosa 6434008ebd Make destructive buttons standalone
- Uninstall VPN

- Remove profile (add to ProfileView)

Create DestructiveButton with iOS 15 .role when available.
2022-04-25 16:34:22 +02:00
Davide De Rosa ac1239daa8 Add headers to active/inactive profile sections
Hide inactive section if empty.
2022-04-25 16:34:13 +02:00
Davide De Rosa 29629c5147 Use lighter font for non-active profiles 2022-04-25 15:35:21 +02:00
Davide De Rosa 84790080be Disable autocorrection on profile name 2022-04-25 15:28:55 +02:00
Davide De Rosa 886d0271ea Restore 'Add' button in NetworkSettings
Makes it clear that added fields must be submitted in order to
be saved.
2022-04-23 15:47:02 +02:00
Davide De Rosa 0b1e465143 Share animation type in theme 2022-04-23 12:11:01 +02:00
Davide De Rosa 7eb2b3bd0e Drop button accent on Organizer rows 2022-04-23 11:48:43 +02:00