blob: 1ea2ca10c805fbd69c512d9740387c92ef160682 [file] [log] [blame]
package com.bumptech.glide.signature;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import com.bumptech.glide.load.Key;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
/**
* A utility class for obtaining a {@link com.bumptech.glide.load.Key} signature containing the application version
* name using {@link android.content.pm.PackageInfo#versionCode}.
*/
public final class ApplicationVersionSignature {
private static final ConcurrentHashMap<String, Key> PACKAGE_NAME_TO_KEY = new ConcurrentHashMap<String, Key>();
/**
* Returns the signature {@link com.bumptech.glide.load.Key} for version code of the Application of the given
* Context.
*/
public static Key obtain(Context context) {
String packageName = context.getPackageName();
Key result = PACKAGE_NAME_TO_KEY.get(packageName);
if (result == null) {
Key toAdd = obtainVersionSignature(context);
result = PACKAGE_NAME_TO_KEY.putIfAbsent(packageName, toAdd);
// There wasn't a previous mapping, so toAdd is now the Key.
if (result == null) {
result = toAdd;
}
}
return result;
}
// Visible for testing.
static void reset() {
PACKAGE_NAME_TO_KEY.clear();
}
private static Key obtainVersionSignature(Context context) {
PackageInfo pInfo = null;
try {
pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
// Should never happen.
e.printStackTrace();
}
final String versionCode;
if (pInfo != null) {
versionCode = String.valueOf(pInfo.versionCode);
} else {
versionCode = UUID.randomUUID().toString();
}
return new StringSignature(versionCode);
}
private ApplicationVersionSignature() {
// Empty for visibility.
}
}