141 lines
5.7 KiB
Java
141 lines
5.7 KiB
Java
package com.eveningoutpost.dexdrip.G5Model;
|
|
|
|
import com.eveningoutpost.dexdrip.Models.JoH;
|
|
import com.eveningoutpost.dexdrip.Models.UserError;
|
|
import com.eveningoutpost.dexdrip.UtilityModels.PersistentStore;
|
|
|
|
/**
|
|
* Created by jamorham on 25/11/2016.
|
|
*/
|
|
|
|
public class DexTimeKeeper {
|
|
private static final String TAG = DexTimeKeeper.class.getSimpleName();
|
|
|
|
private static final String DEX_XMIT_START = "DEX_XMIT_START-";
|
|
private static final long OLDEST_ALLOWED = 1512245359123L;
|
|
private static final long DEX_TRANSMITTER_LIFE_SECONDS = 86400 * 120;
|
|
|
|
private static String lastTransmitterId = null;
|
|
|
|
// update the activation time stored for a transmitter
|
|
public static void updateAge(final String transmitterId, final int dexTimeStamp) {
|
|
updateAge(transmitterId, dexTimeStamp, false);
|
|
}
|
|
|
|
// update the activation time stored for a transmitter
|
|
public static void updateAge(final String transmitterId, final int dexTimeStamp, final boolean absolute) {
|
|
|
|
if ((transmitterId == null) || (transmitterId.length() != 6)) {
|
|
UserError.Log.e(TAG, "Invalid dex transmitter in updateAge: " + transmitterId);
|
|
return;
|
|
}
|
|
if (dexTimeStamp < 1) {
|
|
UserError.Log.e(TAG, "Invalid dex timestamp in updateAge: " + dexTimeStamp);
|
|
if (dexTimeStamp == 0 && absolute) {
|
|
DexResetHelper.offer("Your transmitter clock has stopped or never started. Do you want to hard reset it?");
|
|
}
|
|
return;
|
|
}
|
|
final long longDexTimeStamp = (long) dexTimeStamp;
|
|
final long activation_time = JoH.tsl() - (longDexTimeStamp * 1000L);
|
|
|
|
if (activation_time > JoH.tsl()) {
|
|
UserError.Log.wtf(TAG, "Transmitter activation time is in the future. Not possible to update: " + dexTimeStamp);
|
|
return;
|
|
}
|
|
|
|
UserError.Log.d(TAG, "Activation time updated to: " + JoH.dateTimeText(activation_time));
|
|
PersistentStore.setLong(DEX_XMIT_START + transmitterId, activation_time);
|
|
|
|
}
|
|
|
|
public static int getDexTime(String transmitterId, long timestamp) {
|
|
|
|
if ((transmitterId == null) || (transmitterId.length() != 6)) {
|
|
UserError.Log.e(TAG, "Invalid dex transmitter in getDexTime: " + transmitterId);
|
|
return -3;
|
|
}
|
|
if (timestamp < OLDEST_ALLOWED) {
|
|
UserError.Log.e(TAG, "Invalid timestamp in getDexTime: " + timestamp);
|
|
return -2;
|
|
}
|
|
|
|
final long transmitter_start_timestamp = PersistentStore.getLong(DEX_XMIT_START + transmitterId);
|
|
|
|
if (transmitter_start_timestamp < OLDEST_ALLOWED) {
|
|
if (JoH.ratelimit("no-valid-dex-timestamp-log", 60)) {
|
|
UserError.Log.e(TAG, "No valid timestamp stored for transmitter: " + transmitterId);
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
final long ms_since = timestamp - transmitter_start_timestamp;
|
|
if (ms_since < 0) {
|
|
UserError.Log.e(TAG, "Invalid timestamp comparison for transmitter id: " + transmitterId + " since: " + ms_since + " requested ts: " + JoH.dateTimeText(timestamp) + " with tx start: " + JoH.dateTimeText(transmitter_start_timestamp));
|
|
return -4;
|
|
}
|
|
lastTransmitterId = transmitterId;
|
|
return (int) (ms_since / 1000L);
|
|
}
|
|
|
|
public static long fromDexTimeCached(int dexTimeStamp) {
|
|
return fromDexTime(lastTransmitterId, dexTimeStamp);
|
|
}
|
|
|
|
|
|
public static long fromDexTime(String transmitterId, int dexTimeStamp) {
|
|
if ((transmitterId == null) || (transmitterId.length() != 6)) {
|
|
UserError.Log.e(TAG, "Invalid dex transmitter in fromDexTime: " + transmitterId);
|
|
return -3;
|
|
}
|
|
lastTransmitterId = transmitterId;
|
|
final long transmitter_start_timestamp = PersistentStore.getLong(DEX_XMIT_START + transmitterId);
|
|
if (transmitter_start_timestamp > 0) {
|
|
return transmitter_start_timestamp + (((long) dexTimeStamp) * 1000L);
|
|
} else {
|
|
return -1;
|
|
}
|
|
|
|
}
|
|
|
|
// should we try to use this transmitter
|
|
public static boolean isInDate(String transmitterId) {
|
|
final int valid_time = getDexTime(transmitterId, JoH.tsl());
|
|
return (valid_time >= 0) && (valid_time < DEX_TRANSMITTER_LIFE_SECONDS);
|
|
}
|
|
|
|
public static int getTransmitterAgeInDays(final String transmitterId) {
|
|
final int valid_time = getDexTime(transmitterId, JoH.tsl());
|
|
return (valid_time >= 0) ? valid_time / 86400 : -1;
|
|
}
|
|
|
|
public static String extractForStream(String transmitterId) {
|
|
if (transmitterId == null || transmitterId.length() == 0) return null;
|
|
final long result = PersistentStore.getLong(DEX_XMIT_START + transmitterId);
|
|
if (result == 0) return null;
|
|
return transmitterId + "^" + result;
|
|
}
|
|
|
|
public static void injectFromStream(String stream) {
|
|
if (stream == null) return;
|
|
final String[] components = stream.split("\\^");
|
|
try {
|
|
if (components.length == 2) {
|
|
final long time_stamp = Long.parseLong(components[1]);
|
|
if (time_stamp > OLDEST_ALLOWED) {
|
|
PersistentStore.setLong(DEX_XMIT_START + components[0], time_stamp);
|
|
UserError.Log.d(TAG, "Updating time keeper: " + components[0] + " " + JoH.dateTimeText(time_stamp));
|
|
} else {
|
|
UserError.Log.wtf(TAG, "Dex Timestamp doesn't meet criteria: " + time_stamp);
|
|
}
|
|
} else {
|
|
UserError.Log.e(TAG, "Invalid injectFromStream length: " + stream);
|
|
}
|
|
} catch (NumberFormatException e) {
|
|
UserError.Log.e(TAG, "Invalid injectFromStream: " + stream + " " + e);
|
|
}
|
|
}
|
|
|
|
|
|
}
|