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