Files
native/src/lib/platform-capabilities.ts
T
Linus Rath e67e240840 feat: ask android to sync when contacts or calendars change #34
With device sync on, Android should hear about a change as soon as the
app does, not only at the next periodic sync. This adds what tells it:

- The app's own contact and calendar edits, StateChanges on the live
  stream for `AddressBook`/`ContactCard` and `Calendar`/`CalendarEvent`,
  and the app coming back to the foreground request a sync of that
  account and authority. Requests within 5 s fold into one, and a
  StateChange the engine caused itself (its own upload echoing back) is
  skipped.
- While the app is closed, the account's push subscription carries
  those types too. The FCM and UnifiedPush services hand every push to
  the native router from f743ab0, which requests the syncs, and start
  the mail push task only when a push has `EmailDelivery`; the task also
  returns early for such pushes, so a contact change can never show the
  "newest unread mail" notification.
- At launch, on foreground and when Android's accounts change, the app
  checks Android's accounts against its own: an account removed in
  Android Settings shows sync off and is not recreated, and one whose app
  account is gone stops syncing and posts "Sign in again", keeping its
  data.

The functions that turn sync on and off (`src/device-sync/app/lifecycle.ts`)
come with this; the settings that call them land in a later commit, so
nothing here runs before an account has device sync on.

Checked: the new store, lifecycle, trigger and push tests, `npm run
typecheck`, `npm test` and `npm run i18n:check` on this commit, and the
debug build.
2026-09-27 04:36:51 +02:00

29 lines
1.2 KiB
TypeScript

// Single source of truth for "this feature only exists on some platforms", so
// the UI, the stores and the native bridges all agree on what is reachable.
import { Platform } from 'react-native';
/**
* In-app sideload updates: download the release APK from GitHub and hand it to
* the system package installer (see `lib/install-update`).
*
* Android only. App Store Review guideline 2.5.2 forbids an iOS app from
* downloading and installing executable code, and there is no iOS equivalent of
* the installer intent anyway - iOS builds are updated through TestFlight or
* the App Store. The whole updater surface (banner, settings pane, launch-time
* check) is hidden when this is false.
*/
export const supportsSideloadUpdates = Platform.OS === 'android';
/**
* Device sync: address books and calendars in Android's Contacts and Calendar
* providers, under an account of the app's own type (#34,
* docs/device-sync.md).
*
* Android only: iOS has no third-party sync-provider API for either. The UI
* also needs the native module (`isDeviceSyncAvailable()` in
* `device-sync/native`), so a build without it hides the feature instead of
* failing.
*/
export const supportsDeviceSync = Platform.OS === 'android';