+
+ private static class PreKeyMetadata {
+
+ private int preKeyIdOffset = 1;
+ private int nextSignedPreKeyId = 1;
+ private int kyberPreKeyIdOffset = 1;
+ private int activeLastResortKyberPreKeyId = -1;
+ }
+
+ public class AccountData {
+
+ private final ServiceIdType serviceIdType;
+ private IdentityKeyPair identityKeyPair;
+ private int localRegistrationId;
+ private final PreKeyMetadata preKeyMetadata = new PreKeyMetadata();
+
+ private SignalProtocolStore signalProtocolStore;
+ private PreKeyStore preKeyStore;
+ private SignedPreKeyStore signedPreKeyStore;
+ private KyberPreKeyStore kyberPreKeyStore;
+ private SessionStore sessionStore;
+ private SignalIdentityKeyStore identityKeyStore;
+
+ public AccountData(final ServiceIdType serviceIdType) {
+ this.serviceIdType = serviceIdType;
+ }
+
+ public ServiceId getServiceId() {
+ return getAccountId(serviceIdType);
+ }
+
+ public IdentityKeyPair getIdentityKeyPair() {
+ return identityKeyPair;
+ }
+
+ private void setIdentityKeyPair(final IdentityKeyPair identityKeyPair) {
+ this.identityKeyPair = identityKeyPair;
+ }
+
+ public int getLocalRegistrationId() {
+ return localRegistrationId;
+ }
+
+ private void setLocalRegistrationId(final int localRegistrationId) {
+ this.localRegistrationId = localRegistrationId;
+ this.identityKeyStore = null;
+ }
+
+ public PreKeyMetadata getPreKeyMetadata() {
+ return preKeyMetadata;
+ }
+
+ private SignalServiceAccountDataStore getSignalServiceAccountDataStore() {
+ return getOrCreate(() -> signalProtocolStore,
+ () -> signalProtocolStore = new SignalProtocolStore(getPreKeyStore(),
+ getSignedPreKeyStore(),
+ getKyberPreKeyStore(),
+ getSessionStore(),
+ getIdentityKeyStore(),
+ getSenderKeyStore(),
+ SignalAccount.this::isMultiDevice));
+ }
+
+ private PreKeyStore getPreKeyStore() {
+ return getOrCreate(() -> preKeyStore,
+ () -> preKeyStore = new PreKeyStore(getAccountDatabase(), serviceIdType));
+ }
+
+ private SignedPreKeyStore getSignedPreKeyStore() {
+ return getOrCreate(() -> signedPreKeyStore,
+ () -> signedPreKeyStore = new SignedPreKeyStore(getAccountDatabase(), serviceIdType));
+ }
+
+ private KyberPreKeyStore getKyberPreKeyStore() {
+ return getOrCreate(() -> kyberPreKeyStore,
+ () -> kyberPreKeyStore = new KyberPreKeyStore(getAccountDatabase(), serviceIdType));
+ }
+
+ public SessionStore getSessionStore() {
+ return getOrCreate(() -> sessionStore,
+ () -> sessionStore = new SessionStore(getAccountDatabase(), serviceIdType));
+ }
+
+ public SignalIdentityKeyStore getIdentityKeyStore() {
+ return getOrCreate(() -> identityKeyStore,
+ () -> identityKeyStore = new SignalIdentityKeyStore(getRecipientResolver(),
+ () -> identityKeyPair,
+ localRegistrationId,
+ SignalAccount.this.getIdentityKeyStore()));
+ }
+ }