]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/helper/Context.java
Refactor Context to create helpers lazily
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / helper / Context.java
1 package org.asamk.signal.manager.helper;
2
3 import org.asamk.signal.manager.AttachmentStore;
4 import org.asamk.signal.manager.AvatarStore;
5 import org.asamk.signal.manager.JobExecutor;
6 import org.asamk.signal.manager.SignalDependencies;
7 import org.asamk.signal.manager.StickerPackStore;
8 import org.asamk.signal.manager.storage.SignalAccount;
9
10 import java.util.function.Supplier;
11
12 public class Context {
13
14 private final Object LOCK = new Object();
15
16 private final SignalAccount account;
17 private final SignalDependencies dependencies;
18 private final AvatarStore avatarStore;
19 private final StickerPackStore stickerPackStore;
20 private final AttachmentStore attachmentStore;
21 private final JobExecutor jobExecutor;
22
23 private AttachmentHelper attachmentHelper;
24 private ContactHelper contactHelper;
25 private GroupHelper groupHelper;
26 private GroupV2Helper groupV2Helper;
27 private IdentityHelper identityHelper;
28 private IncomingMessageHandler incomingMessageHandler;
29 private PinHelper pinHelper;
30 private PreKeyHelper preKeyHelper;
31 private ProfileHelper profileHelper;
32 private RecipientHelper recipientHelper;
33 private SendHelper sendHelper;
34 private StorageHelper storageHelper;
35 private SyncHelper syncHelper;
36 private UnidentifiedAccessHelper unidentifiedAccessHelper;
37
38 public Context(
39 final SignalAccount account,
40 final SignalDependencies dependencies,
41 final AvatarStore avatarStore,
42 final AttachmentStore attachmentStore,
43 final StickerPackStore stickerPackStore
44 ) {
45 this.account = account;
46 this.dependencies = dependencies;
47 this.avatarStore = avatarStore;
48 this.stickerPackStore = stickerPackStore;
49 this.attachmentStore = attachmentStore;
50 this.jobExecutor = new JobExecutor(this);
51 }
52
53 public SignalAccount getAccount() {
54 return account;
55 }
56
57 public SignalDependencies getDependencies() {
58 return dependencies;
59 }
60
61 public AvatarStore getAvatarStore() {
62 return avatarStore;
63 }
64
65 public StickerPackStore getStickerPackStore() {
66 return stickerPackStore;
67 }
68
69 AttachmentStore getAttachmentStore() {
70 return attachmentStore;
71 }
72
73 JobExecutor getJobExecutor() {
74 return jobExecutor;
75 }
76
77 public AttachmentHelper getAttachmentHelper() {
78 return getOrCreate(() -> attachmentHelper, () -> attachmentHelper = new AttachmentHelper(this));
79 }
80
81 public ContactHelper getContactHelper() {
82 return getOrCreate(() -> contactHelper, () -> contactHelper = new ContactHelper(account));
83 }
84
85 GroupV2Helper getGroupV2Helper() {
86 return getOrCreate(() -> groupV2Helper, () -> groupV2Helper = new GroupV2Helper(this));
87 }
88
89 public GroupHelper getGroupHelper() {
90 return getOrCreate(() -> groupHelper, () -> groupHelper = new GroupHelper(this));
91 }
92
93 public IdentityHelper getIdentityHelper() {
94 return getOrCreate(() -> identityHelper, () -> identityHelper = new IdentityHelper(this));
95 }
96
97 public IncomingMessageHandler getIncomingMessageHandler() {
98 return getOrCreate(() -> incomingMessageHandler,
99 () -> this.incomingMessageHandler = new IncomingMessageHandler(this));
100 }
101
102 public PinHelper getPinHelper() {
103 return getOrCreate(() -> pinHelper, () -> pinHelper = new PinHelper(dependencies.getKeyBackupService()));
104 }
105
106 public PreKeyHelper getPreKeyHelper() {
107 return getOrCreate(() -> preKeyHelper, () -> preKeyHelper = new PreKeyHelper(account, dependencies));
108 }
109
110 public ProfileHelper getProfileHelper() {
111 return getOrCreate(() -> profileHelper, () -> profileHelper = new ProfileHelper(this));
112 }
113
114 public RecipientHelper getRecipientHelper() {
115 return getOrCreate(() -> recipientHelper, () -> recipientHelper = new RecipientHelper(this));
116 }
117
118 public SendHelper getSendHelper() {
119 return getOrCreate(() -> sendHelper, () -> sendHelper = new SendHelper(this));
120 }
121
122 public StorageHelper getStorageHelper() {
123 return getOrCreate(() -> storageHelper, () -> storageHelper = new StorageHelper(this));
124 }
125
126 public SyncHelper getSyncHelper() {
127 return getOrCreate(() -> syncHelper, () -> syncHelper = new SyncHelper(this));
128 }
129
130 UnidentifiedAccessHelper getUnidentifiedAccessHelper() {
131 return getOrCreate(() -> unidentifiedAccessHelper,
132 () -> unidentifiedAccessHelper = new UnidentifiedAccessHelper(this));
133 }
134
135 private <T> T getOrCreate(Supplier<T> supplier, Callable creator) {
136 var value = supplier.get();
137 if (value != null) {
138 return value;
139 }
140
141 synchronized (LOCK) {
142 value = supplier.get();
143 if (value != null) {
144 return value;
145 }
146 creator.call();
147 return supplier.get();
148 }
149 }
150
151 private interface Callable {
152
153 void call();
154 }
155 }