Use properly fixed numeral values in Trust enum

Andreas Straub created

Why, oh God, why?! #thanksjamesgosling

Change summary

src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java | 30 
src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java   | 10 
2 files changed, 31 insertions(+), 9 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java 🔗

@@ -99,10 +99,28 @@ public class AxolotlService {
 		private int currentPreKeyId = 0;
 
 		public enum Trust {
-			UNDECIDED, // 0
-			TRUSTED,
-			UNTRUSTED,
-			COMPROMISED;
+			UNDECIDED(0),
+			TRUSTED(1),
+			UNTRUSTED(2),
+			COMPROMISED(3);
+
+			private static final Map<Integer, Trust> trustsByValue = new HashMap<>();
+
+			static {
+				for (Trust trust : Trust.values()) {
+					trustsByValue.put(trust.getCode(), trust);
+				}
+			}
+
+			private final int code;
+
+			Trust(int code){
+				this.code = code;
+			}
+
+			public int getCode() {
+				return this.code;
+			}
 
 			public String toString() {
 				switch(this){
@@ -119,6 +137,10 @@ public class AxolotlService {
 			public static Trust fromBoolean(Boolean trusted) {
 				return trusted?TRUSTED:UNTRUSTED;
 			}
+
+			public static Trust fromCode(int code) {
+				return trustsByValue.get(code);
+			}
 		};
 
 		private static IdentityKeyPair generateIdentityKeyPair() {

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java 🔗

@@ -845,7 +845,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 		while(cursor.moveToNext()) {
 			if ( trust != null &&
 					cursor.getInt(cursor.getColumnIndex(AxolotlService.SQLiteAxolotlStore.TRUSTED))
-							!= trust.ordinal()) {
+							!= trust.getCode()) {
 				continue;
 			}
 			try {
@@ -864,7 +864,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 		String[] args = {
 				account.getUuid(),
 				name,
-				String.valueOf(AxolotlService.SQLiteAxolotlStore.Trust.TRUSTED.ordinal())
+				String.valueOf(AxolotlService.SQLiteAxolotlStore.Trust.TRUSTED.getCode())
 		};
 		return DatabaseUtils.queryNumEntries(db, AxolotlService.SQLiteAxolotlStore.IDENTITIES_TABLENAME,
 				AxolotlService.SQLiteAxolotlStore.ACCOUNT + " = ?"
@@ -886,7 +886,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 		values.put(AxolotlService.SQLiteAxolotlStore.OWN, own ? 1 : 0);
 		values.put(AxolotlService.SQLiteAxolotlStore.FINGERPRINT, fingerprint);
 		values.put(AxolotlService.SQLiteAxolotlStore.KEY, base64Serialized);
-		values.put(AxolotlService.SQLiteAxolotlStore.TRUSTED, trusted.ordinal());
+		values.put(AxolotlService.SQLiteAxolotlStore.TRUSTED, trusted.getCode());
 		db.insert(AxolotlService.SQLiteAxolotlStore.IDENTITIES_TABLENAME, null, values);
 	}
 
@@ -896,7 +896,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 		if (cursor.getCount() > 0) {
 			cursor.moveToFirst();
 			int trustValue = cursor.getInt(cursor.getColumnIndex(AxolotlService.SQLiteAxolotlStore.TRUSTED));
-			trust = AxolotlService.SQLiteAxolotlStore.Trust.values()[trustValue];
+			trust = AxolotlService.SQLiteAxolotlStore.Trust.fromCode(trustValue);
 		}
 		cursor.close();
 		return trust;
@@ -909,7 +909,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 				fingerprint
 		};
 		ContentValues values = new ContentValues();
-		values.put(AxolotlService.SQLiteAxolotlStore.TRUSTED, trust.ordinal());
+		values.put(AxolotlService.SQLiteAxolotlStore.TRUSTED, trust.getCode());
 		int rows = db.update(AxolotlService.SQLiteAxolotlStore.IDENTITIES_TABLENAME, values,
 				AxolotlService.SQLiteAxolotlStore.ACCOUNT + " = ? AND "
 				+ AxolotlService.SQLiteAxolotlStore.FINGERPRINT + " = ? ",