• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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