FingerprintStatus.java

  1package eu.siacs.conversations.crypto.axolotl;
  2
  3import android.content.ContentValues;
  4import android.database.Cursor;
  5
  6public class FingerprintStatus implements Comparable<FingerprintStatus> {
  7
  8    private static final long DO_NOT_OVERWRITE = -1;
  9
 10    private Trust trust = Trust.UNTRUSTED;
 11    private boolean active = false;
 12    private long lastActivation = DO_NOT_OVERWRITE;
 13
 14    @Override
 15    public boolean equals(Object o) {
 16        if (this == o) return true;
 17        if (o == null || getClass() != o.getClass()) return false;
 18
 19        FingerprintStatus that = (FingerprintStatus) o;
 20
 21        return active == that.active && trust == that.trust;
 22    }
 23
 24    @Override
 25    public int hashCode() {
 26        int result = trust.hashCode();
 27        result = 31 * result + (active ? 1 : 0);
 28        return result;
 29    }
 30
 31    private FingerprintStatus() {
 32
 33
 34    }
 35
 36    public ContentValues toContentValues() {
 37        final ContentValues contentValues = new ContentValues();
 38        contentValues.put(SQLiteAxolotlStore.TRUST,trust.toString());
 39        contentValues.put(SQLiteAxolotlStore.ACTIVE,active ? 1 : 0);
 40        if (lastActivation != DO_NOT_OVERWRITE) {
 41            contentValues.put(SQLiteAxolotlStore.LAST_ACTIVATION,lastActivation);
 42        }
 43        return contentValues;
 44    }
 45
 46    public static FingerprintStatus fromCursor(Cursor cursor) {
 47        final FingerprintStatus status = new FingerprintStatus();
 48        try {
 49            status.trust = Trust.valueOf(cursor.getString(cursor.getColumnIndex(SQLiteAxolotlStore.TRUST)));
 50        } catch(IllegalArgumentException e) {
 51            status.trust = Trust.UNTRUSTED;
 52        }
 53        status.active = cursor.getInt(cursor.getColumnIndex(SQLiteAxolotlStore.ACTIVE)) > 0;
 54        status.lastActivation = cursor.getLong(cursor.getColumnIndex(SQLiteAxolotlStore.LAST_ACTIVATION));
 55        return status;
 56    }
 57
 58    public static FingerprintStatus createActiveUndecided() {
 59        final FingerprintStatus status = new FingerprintStatus();
 60        status.trust = Trust.UNDECIDED;
 61        status.active = true;
 62        status.lastActivation = System.currentTimeMillis();
 63        return status;
 64    }
 65
 66    public static FingerprintStatus createActiveTrusted() {
 67        final FingerprintStatus status = new FingerprintStatus();
 68        status.trust = Trust.TRUSTED;
 69        status.active = true;
 70        status.lastActivation = System.currentTimeMillis();
 71        return status;
 72    }
 73
 74    public static FingerprintStatus createActiveVerified(boolean x509) {
 75        final FingerprintStatus status = new FingerprintStatus();
 76        status.trust = x509 ? Trust.VERIFIED_X509 : Trust.VERIFIED;
 77        status.active = true;
 78        return status;
 79    }
 80
 81    public static FingerprintStatus createActive(boolean trusted) {
 82        final FingerprintStatus status = new FingerprintStatus();
 83        status.trust = trusted ? Trust.TRUSTED : Trust.UNTRUSTED;
 84        status.active = true;
 85        return status;
 86    }
 87
 88    public boolean isTrustedAndActive() {
 89        return active && isTrusted();
 90    }
 91
 92    public boolean isTrusted() {
 93        return trust == Trust.TRUSTED || isVerified();
 94    }
 95
 96    public boolean isVerified() {
 97        return trust == Trust.VERIFIED || trust == Trust.VERIFIED_X509;
 98    }
 99
100    public boolean isCompromised() {
101        return trust == Trust.COMPROMISED;
102    }
103
104    public boolean isActive() {
105        return active;
106    }
107
108    public FingerprintStatus toActive() {
109        FingerprintStatus status = new FingerprintStatus();
110        status.trust = trust;
111        if (!status.active) {
112            status.lastActivation = System.currentTimeMillis();
113        }
114        status.active = true;
115        return status;
116    }
117
118    public FingerprintStatus toInactive() {
119        FingerprintStatus status = new FingerprintStatus();
120        status.trust = trust;
121        status.active = false;
122        return status;
123    }
124
125    public Trust getTrust() {
126        return trust;
127    }
128
129    public FingerprintStatus toVerified() {
130        FingerprintStatus status = new FingerprintStatus();
131        status.active = active;
132        status.trust = Trust.VERIFIED;
133        return status;
134    }
135
136    public FingerprintStatus toUntrusted() {
137        FingerprintStatus status = new FingerprintStatus();
138        status.active = active;
139        status.trust = Trust.UNTRUSTED;
140        return status;
141    }
142
143    public static FingerprintStatus createInactiveVerified() {
144        final FingerprintStatus status = new FingerprintStatus();
145        status.trust = Trust.VERIFIED;
146        status.active = false;
147        return status;
148    }
149
150    @Override
151    public int compareTo(FingerprintStatus o) {
152        if (active == o.active) {
153            if (lastActivation > o.lastActivation) {
154                return -1;
155            } else if (lastActivation < o.lastActivation) {
156                return 1;
157            } else {
158                return 0;
159            }
160        } else if (active){
161            return -1;
162        } else {
163            return 1;
164        }
165    }
166
167    public long getLastActivation() {
168        return lastActivation;
169    }
170
171    public enum Trust {
172        COMPROMISED,
173        UNDECIDED,
174        UNTRUSTED,
175        TRUSTED,
176        VERIFIED,
177        VERIFIED_X509
178    }
179
180}