/* Copyright 2024 New Vector Ltd. Copyright 2019 The Matrix.org Foundation C.I.C Copyright 2018 New Vector Ltd Copyright 2015 OpenMarket Ltd SPDX-License-Identifier: AGPL-3.0-only Please see LICENSE in the repository root for full details. */ #import #import "MXKAccount.h" /** Posted when the user logged in with a matrix account. The notification object is the new added account. */ extern NSString *const kMXKAccountManagerDidAddAccountNotification; /** Posted when an existing account is logged out. The notification object is the removed account. */ extern NSString *const kMXKAccountManagerDidRemoveAccountNotification; /** Posted when an existing account is soft logged out. The notification object is the account. */ extern NSString *const kMXKAccountManagerDidSoftlogoutAccountNotification; /** Used to identify the type of data when requesting MXKeyProvider */ extern NSString *const MXKAccountManagerDataType; /** `MXKAccountManager` manages a pool of `MXKAccount` instances. */ @interface MXKAccountManager : NSObject /// Flag indicating that saving accounts enabled. Defaults to `YES`. @property (nonatomic, assign, getter=isSavingAccountsEnabled) BOOL savingAccountsEnabled; /** The class of store used to open matrix session for the accounts. This class must be conformed to MXStore protocol. By default this class is MXFileStore. */ @property (nonatomic) Class storeClass; /** List of all available accounts (enabled and disabled). */ @property (nonatomic, readonly) NSArray *accounts; /** List of active accounts (only enabled accounts) */ @property (nonatomic, readonly) NSArray *activeAccounts; /** The device token used for Apple Push Notification Service registration. */ @property (nonatomic, copy) NSData *apnsDeviceToken; /** The APNS status: YES when app is registered for remote notif, and device token is known. */ @property (nonatomic) BOOL isAPNSAvailable; /** The device token used for Push notifications registration (PushKit support). */ @property (nonatomic, copy, readonly) NSData *pushDeviceToken; /** The current options of the Push notifications based on PushKit. */ @property (nonatomic, copy, readonly) NSDictionary *pushOptions; /** Set the push token and the potential push options. For example, for clients that want to go & fetch the body of the event themselves anyway, the key-value `format: event_id_only` may be used in `pushOptions` dictionary to tell the HTTP pusher to send just the event_id of the event it's notifying about, the room id and the notification counts. @param pushDeviceToken the push token. @param pushOptions dictionary of the push options (may be nil). */ - (void)setPushDeviceToken:(NSData *)pushDeviceToken withPushOptions:(NSDictionary *)pushOptions; /** The PushKit status: YES when app is registered for push notif, and push token is known. */ @property (nonatomic) BOOL isPushAvailable; /** Retrieve the MXKAccounts manager. @return the MXKAccounts manager. */ + (MXKAccountManager *)sharedManager; + (MXKAccountManager *)sharedManagerWithReload:(BOOL)reload; /** Check for each enabled account if a matrix session is already opened. Open a matrix session for each enabled account which doesn't have a session. The developper must set 'storeClass' before the first call of this method if the default class is not suitable. */ - (void)prepareSessionForActiveAccounts; /** Save a snapshot of the current accounts. */ - (void)saveAccounts; /** Add an account and save the new account list. Optionally a matrix session may be opened for the provided account. @param account a matrix account. @param openSession YES to open a matrix session (this value is ignored if the account is disabled). */ - (void)addAccount:(MXKAccount *)account andOpenSession:(BOOL)openSession; /** Remove the provided account and save the new account list. This method is used in case of logout. @note equivalent to `removeAccount:sendLogoutRequest:completion:` method with `sendLogoutRequest` parameter to YES @param account a matrix account. @param completion the block to execute at the end of the operation. */ - (void)removeAccount:(MXKAccount *)account completion:(void (^)(void))completion; /** Remove the provided account and save the new account list. This method is used in case of logout or account deactivation. @param account a matrix account. @param sendLogoutRequest Indicate whether send logout request to homeserver. @param completion the block to execute at the end of the operation. */ - (void)removeAccount:(MXKAccount*)account sendLogoutRequest:(BOOL)sendLogoutRequest completion:(void (^)(void))completion; /** Log out and remove all the existing accounts @param completion the block to execute at the end of the operation. */ - (void)logoutWithCompletion:(void (^)(void))completion; /** Soft logout an account. @param account a matrix account. */ - (void)softLogout:(MXKAccount*)account; /** Hydrate an existing account by using the credentials provided. This updates account credentials and restarts the account session If the credentials belong to a different user from the account already stored, the old account will be cleared automatically. @param account a matrix account. @param credentials the new credentials. */ - (void)hydrateAccount:(MXKAccount*)account withCredentials:(MXCredentials*)credentials; /** Retrieve the account for a user id. @param userId the user id. @return the user's account (nil if no account exist). */ - (MXKAccount *)accountForUserId:(NSString *)userId; /** Retrieve an account that knows the room with the passed id or alias. Note: The method is not accurate as it returns the first account that matches. @param roomIdOrAlias the room id or alias. @return the user's account. Nil if no account matches. */ - (MXKAccount *)accountKnowingRoomWithRoomIdOrAlias:(NSString *)roomIdOrAlias; /** Retrieve an account that knows the user with the passed id. Note: The method is not accurate as it returns the first account that matches. @param userId the user id. @return the user's account. Nil if no account matches. */ - (MXKAccount *)accountKnowingUserWithUserId:(NSString *)userId; - (void)readAndWriteCredentials:(void (^)(NSArray * _Nullable readData, void (^completion)(BOOL didUpdateCredentials)))readAnWriteHandler; @end