1 package com.bumptech.glide.load.engine; 2 3 import com.bumptech.glide.load.Encoder; 4 import com.bumptech.glide.load.Key; 5 import com.bumptech.glide.load.ResourceDecoder; 6 import com.bumptech.glide.load.ResourceEncoder; 7 import com.bumptech.glide.load.Transformation; 8 import com.bumptech.glide.load.resource.transcode.ResourceTranscoder; 9 10 import java.io.UnsupportedEncodingException; 11 import java.nio.ByteBuffer; 12 import java.security.MessageDigest; 13 14 @SuppressWarnings("rawtypes") 15 class EngineKey implements Key { 16 private final String id; 17 private final int width; 18 private final int height; 19 private final ResourceDecoder cacheDecoder; 20 private final ResourceDecoder decoder; 21 private final Transformation transformation; 22 private final ResourceEncoder encoder; 23 private final ResourceTranscoder transcoder; 24 private final Encoder sourceEncoder; 25 private final Key signature; 26 private String stringKey; 27 private int hashCode; 28 private Key originalKey; 29 EngineKey(String id, Key signature, int width, int height, ResourceDecoder cacheDecoder, ResourceDecoder decoder, Transformation transformation, ResourceEncoder encoder, ResourceTranscoder transcoder, Encoder sourceEncoder)30 public EngineKey(String id, Key signature, int width, int height, ResourceDecoder cacheDecoder, 31 ResourceDecoder decoder, Transformation transformation, ResourceEncoder encoder, 32 ResourceTranscoder transcoder, Encoder sourceEncoder) { 33 this.id = id; 34 this.signature = signature; 35 this.width = width; 36 this.height = height; 37 this.cacheDecoder = cacheDecoder; 38 this.decoder = decoder; 39 this.transformation = transformation; 40 this.encoder = encoder; 41 this.transcoder = transcoder; 42 this.sourceEncoder = sourceEncoder; 43 } 44 getOriginalKey()45 public Key getOriginalKey() { 46 if (originalKey == null) { 47 originalKey = new OriginalKey(id, signature); 48 } 49 return originalKey; 50 } 51 52 @Override equals(Object o)53 public boolean equals(Object o) { 54 if (this == o) { 55 return true; 56 } 57 if (o == null || getClass() != o.getClass()) { 58 return false; 59 } 60 61 EngineKey engineKey = (EngineKey) o; 62 63 if (!id.equals(engineKey.id)) { 64 return false; 65 } else if (!signature.equals(engineKey.signature)) { 66 return false; 67 } else if (height != engineKey.height) { 68 return false; 69 } else if (width != engineKey.width) { 70 return false; 71 } else if (transformation == null ^ engineKey.transformation == null) { 72 return false; 73 } else if (transformation != null && !transformation.getId().equals(engineKey.transformation.getId())) { 74 return false; 75 } else if (decoder == null ^ engineKey.decoder == null) { 76 return false; 77 } else if (decoder != null && !decoder.getId().equals(engineKey.decoder.getId())) { 78 return false; 79 } else if (cacheDecoder == null ^ engineKey.cacheDecoder == null) { 80 return false; 81 } else if (cacheDecoder != null && !cacheDecoder.getId().equals(engineKey.cacheDecoder.getId())) { 82 return false; 83 } else if (encoder == null ^ engineKey.encoder == null) { 84 return false; 85 } else if (encoder != null && !encoder.getId().equals(engineKey.encoder.getId())) { 86 return false; 87 } else if (transcoder == null ^ engineKey.transcoder == null) { 88 return false; 89 } else if (transcoder != null && !transcoder.getId().equals(engineKey.transcoder.getId())) { 90 return false; 91 } else if (sourceEncoder == null ^ engineKey.sourceEncoder == null) { 92 return false; 93 } else if (sourceEncoder != null && !sourceEncoder.getId().equals(engineKey.sourceEncoder.getId())) { 94 return false; 95 } 96 return true; 97 } 98 99 @Override hashCode()100 public int hashCode() { 101 if (hashCode == 0) { 102 hashCode = id.hashCode(); 103 hashCode = 31 * hashCode + signature.hashCode(); 104 hashCode = 31 * hashCode + width; 105 hashCode = 31 * hashCode + height; 106 hashCode = 31 * hashCode + (cacheDecoder != null ? cacheDecoder .getId().hashCode() : 0); 107 hashCode = 31 * hashCode + (decoder != null ? decoder .getId().hashCode() : 0); 108 hashCode = 31 * hashCode + (transformation != null ? transformation.getId().hashCode() : 0); 109 hashCode = 31 * hashCode + (encoder != null ? encoder .getId().hashCode() : 0); 110 hashCode = 31 * hashCode + (transcoder != null ? transcoder .getId().hashCode() : 0); 111 hashCode = 31 * hashCode + (sourceEncoder != null ? sourceEncoder .getId().hashCode() : 0); 112 } 113 return hashCode; 114 } 115 116 @Override toString()117 public String toString() { 118 if (stringKey == null) { 119 stringKey = new StringBuilder() 120 .append(id) 121 .append(signature) 122 .append(width) 123 .append(height) 124 .append(cacheDecoder != null ? cacheDecoder .getId() : "") 125 .append(decoder != null ? decoder .getId() : "") 126 .append(transformation != null ? transformation.getId() : "") 127 .append(encoder != null ? encoder .getId() : "") 128 .append(transcoder != null ? transcoder .getId() : "") 129 .append(sourceEncoder != null ? sourceEncoder .getId() : "") 130 .toString(); 131 } 132 return stringKey; 133 } 134 135 @Override updateDiskCacheKey(MessageDigest messageDigest)136 public void updateDiskCacheKey(MessageDigest messageDigest) throws UnsupportedEncodingException { 137 byte[] dimensions = ByteBuffer.allocate(8) 138 .putInt(width) 139 .putInt(height) 140 .array(); 141 signature.updateDiskCacheKey(messageDigest); 142 messageDigest.update(id.getBytes(STRING_CHARSET_NAME)); 143 messageDigest.update(dimensions); 144 messageDigest.update((cacheDecoder != null ? cacheDecoder .getId() : "").getBytes(STRING_CHARSET_NAME)); 145 messageDigest.update((decoder != null ? decoder .getId() : "").getBytes(STRING_CHARSET_NAME)); 146 messageDigest.update((transformation != null ? transformation.getId() : "").getBytes(STRING_CHARSET_NAME)); 147 messageDigest.update((encoder != null ? encoder .getId() : "").getBytes(STRING_CHARSET_NAME)); 148 // The Transcoder is not included in the disk cache key because its result is not cached. 149 messageDigest.update((sourceEncoder != null ? sourceEncoder .getId() : "").getBytes(STRING_CHARSET_NAME)); 150 } 151 } 152