That fuck shit the fascists are using
1package org.tm.archive.util;
2
3import androidx.annotation.NonNull;
4import androidx.annotation.Nullable;
5import androidx.annotation.VisibleForTesting;
6
7import com.annimon.stream.Stream;
8import com.fasterxml.jackson.annotation.JsonProperty;
9
10import org.signal.core.util.logging.Log;
11import org.tm.archive.BuildConfig;
12
13import java.io.IOException;
14import java.util.Objects;
15
16public final class RemoteDeprecation {
17
18 private static final String TAG = Log.tag(RemoteDeprecation.class);
19
20 private RemoteDeprecation() { }
21
22 /**
23 * @return The amount of time (in milliseconds) until this client version expires, or -1 if
24 * there's no pending expiration.
25 */
26 public static long getTimeUntilDeprecation() {
27 return getTimeUntilDeprecation(FeatureFlags.clientExpiration(), System.currentTimeMillis(), BuildConfig.VERSION_NAME);
28 }
29
30 /**
31 * @return The amount of time (in milliseconds) until this client version expires, or -1 if
32 * there's no pending expiration.
33 */
34 @VisibleForTesting
35 static long getTimeUntilDeprecation(String json, long currentTime, @NonNull String currentVersion) {
36 if (Util.isEmpty(json)) {
37 return -1;
38 }
39
40 try {
41 SemanticVersion ourVersion = Objects.requireNonNull(SemanticVersion.parse(currentVersion));
42 ClientExpiration[] expirations = JsonUtils.fromJson(json, ClientExpiration[].class);
43
44 ClientExpiration expiration = Stream.of(expirations)
45 .filter(c -> c.getVersion() != null && c.getExpiration() != -1)
46 .filter(c -> c.requireVersion().compareTo(ourVersion) > 0)
47 .sortBy(ClientExpiration::getExpiration)
48 .findFirst()
49 .orElse(null);
50
51 if (expiration != null) {
52 return Math.max(expiration.getExpiration() - currentTime, 0);
53 }
54 } catch (IOException e) {
55 Log.w(TAG, e);
56 }
57
58 return -1;
59 }
60
61 private static final class ClientExpiration {
62 @JsonProperty
63 private final String minVersion;
64
65 @JsonProperty
66 private final String iso8601;
67
68 ClientExpiration(@Nullable @JsonProperty("minVersion") String minVersion,
69 @Nullable @JsonProperty("iso8601") String iso8601)
70 {
71 this.minVersion = minVersion;
72 this.iso8601 = iso8601;
73 }
74
75 public @Nullable SemanticVersion getVersion() {
76 return SemanticVersion.parse(minVersion);
77 }
78
79 public @NonNull SemanticVersion requireVersion() {
80 return Objects.requireNonNull(getVersion());
81 }
82
83 public long getExpiration() {
84 return DateUtils.parseIso8601(iso8601);
85 }
86 }
87
88}