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 createActiveVerified(boolean x509) {
 67        final FingerprintStatus status = new FingerprintStatus();
 68        status.trust = x509 ? Trust.VERIFIED_X509 : Trust.VERIFIED;
 69        status.active = true;
 70        return status;
 71    }
 72
 73    public static FingerprintStatus createActive(boolean trusted) {
 74        final FingerprintStatus status = new FingerprintStatus();
 75        status.trust = trusted ? Trust.TRUSTED : Trust.UNTRUSTED;
 76        status.active = true;
 77        return status;
 78    }
 79
 80    public boolean isTrustedAndActive() {
 81        return active && isTrusted();
 82    }
 83
 84    public boolean isTrusted() {
 85        return trust == Trust.TRUSTED || isVerified();
 86    }
 87
 88    public boolean isVerified() {
 89        return trust == Trust.VERIFIED || trust == Trust.VERIFIED_X509;
 90    }
 91
 92    public boolean isCompromised() {
 93        return trust == Trust.COMPROMISED;
 94    }
 95
 96    public boolean isActive() {
 97        return active;
 98    }
 99
100    public FingerprintStatus toActive() {
101        FingerprintStatus status = new FingerprintStatus();
102        status.trust = trust;
103        if (!status.active) {
104            status.lastActivation = System.currentTimeMillis();
105        }
106        status.active = true;
107        return status;
108    }
109
110    public FingerprintStatus toInactive() {
111        FingerprintStatus status = new FingerprintStatus();
112        status.trust = trust;
113        status.active = false;
114        return status;
115    }
116
117    public Trust getTrust() {
118        return trust;
119    }
120
121    public static FingerprintStatus createCompromised() {
122        FingerprintStatus status = new FingerprintStatus();
123        status.active = false;
124        status.trust = Trust.COMPROMISED;
125        return status;
126    }
127
128    public FingerprintStatus toVerified() {
129        FingerprintStatus status = new FingerprintStatus();
130        status.active = active;
131        status.trust = Trust.VERIFIED;
132        return status;
133    }
134
135    public static FingerprintStatus createInactiveVerified() {
136        final FingerprintStatus status = new FingerprintStatus();
137        status.trust = Trust.VERIFIED;
138        status.active = false;
139        return status;
140    }
141
142    @Override
143    public int compareTo(FingerprintStatus o) {
144        if (active == o.active) {
145            if (lastActivation > o.lastActivation) {
146                return -1;
147            } else if (lastActivation < o.lastActivation) {
148                return 1;
149            } else {
150                return 0;
151            }
152        } else if (active){
153            return -1;
154        } else {
155            return 1;
156        }
157    }
158
159    public enum Trust {
160        COMPROMISED,
161        UNDECIDED,
162        UNTRUSTED,
163        TRUSTED,
164        VERIFIED,
165        VERIFIED_X509
166    }
167
168}