• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.bumptech.glide.signature;
2 
3 import android.content.Context;
4 import android.content.pm.PackageInfo;
5 import android.content.pm.PackageManager;
6 
7 import com.bumptech.glide.load.Key;
8 
9 import java.util.UUID;
10 import java.util.concurrent.ConcurrentHashMap;
11 
12 /**
13  * A utility class for obtaining a {@link com.bumptech.glide.load.Key} signature containing the application version
14  * name using {@link android.content.pm.PackageInfo#versionCode}.
15  */
16 public final class ApplicationVersionSignature {
17     private static final ConcurrentHashMap<String, Key> PACKAGE_NAME_TO_KEY = new ConcurrentHashMap<String, Key>();
18 
19     /**
20      * Returns the signature {@link com.bumptech.glide.load.Key} for version code of the Application of the given
21      * Context.
22      */
obtain(Context context)23     public static Key obtain(Context context) {
24         String packageName = context.getPackageName();
25         Key result = PACKAGE_NAME_TO_KEY.get(packageName);
26         if (result == null) {
27             Key toAdd = obtainVersionSignature(context);
28             result = PACKAGE_NAME_TO_KEY.putIfAbsent(packageName, toAdd);
29             // There wasn't a previous mapping, so toAdd is now the Key.
30             if (result == null) {
31                 result = toAdd;
32             }
33         }
34 
35         return result;
36     }
37 
38     // Visible for testing.
reset()39     static void reset() {
40         PACKAGE_NAME_TO_KEY.clear();
41     }
42 
obtainVersionSignature(Context context)43     private static Key obtainVersionSignature(Context context) {
44         PackageInfo pInfo = null;
45         try {
46             pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
47         } catch (PackageManager.NameNotFoundException e) {
48             // Should never happen.
49             e.printStackTrace();
50         }
51         final String versionCode;
52         if (pInfo != null) {
53             versionCode = String.valueOf(pInfo.versionCode);
54         } else {
55             versionCode = UUID.randomUUID().toString();
56         }
57         return new StringSignature(versionCode);
58     }
59 
ApplicationVersionSignature()60     private ApplicationVersionSignature() {
61         // Empty for visibility.
62     }
63 }
64