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