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        return createActive(trusted != null && trusted);
 83    }
 84
 85    public static FingerprintStatus createActive(boolean trusted) {
 86        final FingerprintStatus status = new FingerprintStatus();
 87        status.trust = trusted ? Trust.TRUSTED : Trust.UNTRUSTED;
 88        status.active = true;
 89        return status;
 90    }
 91
 92    public boolean isTrustedAndActive() {
 93        return active && isTrusted();
 94    }
 95
 96    public boolean isTrusted() {
 97        return trust == Trust.TRUSTED || isVerified();
 98    }
 99
100    public boolean isVerified() {
101        return trust == Trust.VERIFIED || trust == Trust.VERIFIED_X509;
102    }
103
104    public boolean isCompromised() {
105        return trust == Trust.COMPROMISED;
106    }
107
108    public boolean isActive() {
109        return active;
110    }
111
112    public FingerprintStatus toActive() {
113        FingerprintStatus status = new FingerprintStatus();
114        status.trust = trust;
115        if (!status.active) {
116            status.lastActivation = System.currentTimeMillis();
117        }
118        status.active = true;
119        return status;
120    }
121
122    public FingerprintStatus toInactive() {
123        FingerprintStatus status = new FingerprintStatus();
124        status.trust = trust;
125        status.active = false;
126        return status;
127    }
128
129    public Trust getTrust() {
130        return trust;
131    }
132
133    public FingerprintStatus toVerified() {
134        FingerprintStatus status = new FingerprintStatus();
135        status.active = active;
136        status.trust = Trust.VERIFIED;
137        return status;
138    }
139
140    public FingerprintStatus toUntrusted() {
141        FingerprintStatus status = new FingerprintStatus();
142        status.active = active;
143        status.trust = Trust.UNTRUSTED;
144        return status;
145    }
146
147    public static FingerprintStatus createInactiveVerified() {
148        final FingerprintStatus status = new FingerprintStatus();
149        status.trust = Trust.VERIFIED;
150        status.active = false;
151        return status;
152    }
153
154    @Override
155    public int compareTo(FingerprintStatus o) {
156        if (active == o.active) {
157            if (lastActivation > o.lastActivation) {
158                return -1;
159            } else if (lastActivation < o.lastActivation) {
160                return 1;
161            } else {
162                return 0;
163            }
164        } else if (active){
165            return -1;
166        } else {
167            return 1;
168        }
169    }
170
171    public long getLastActivation() {
172        return lastActivation;
173    }
174
175    public enum Trust {
176        COMPROMISED,
177        UNDECIDED,
178        UNTRUSTED,
179        TRUSTED,
180        VERIFIED,
181        VERIFIED_X509
182    }
183
184}