Add javax.crypto.Mac as a supported CryptoObject to Fingerprint

Fixes bug 20660180

Change-Id: I421c246ef776847835ede4be1d72721c35cf951c
(cherry picked from commit 0ecd5c20d93c24251975f3ff7cb0494039e5ea20)
diff --git a/api/current.txt b/api/current.txt
index f360940..1ffa5aa 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -13918,7 +13918,9 @@
   public static class FingerprintManager.CryptoObject {
     ctor public FingerprintManager.CryptoObject(java.security.Signature);
     ctor public FingerprintManager.CryptoObject(javax.crypto.Cipher);
+    ctor public FingerprintManager.CryptoObject(javax.crypto.Mac);
     method public javax.crypto.Cipher getCipher();
+    method public javax.crypto.Mac getMac();
     method public java.security.Signature getSignature();
   }
 
diff --git a/api/system-current.txt b/api/system-current.txt
index 17dd7f1..15989b3 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -14217,7 +14217,9 @@
   public static class FingerprintManager.CryptoObject {
     ctor public FingerprintManager.CryptoObject(java.security.Signature);
     ctor public FingerprintManager.CryptoObject(javax.crypto.Cipher);
+    ctor public FingerprintManager.CryptoObject(javax.crypto.Mac);
     method public javax.crypto.Cipher getCipher();
+    method public javax.crypto.Mac getMac();
     method public java.security.Signature getSignature();
   }
 
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 2257b0a..9f344ad 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -42,6 +42,7 @@
 import java.util.List;
 
 import javax.crypto.Cipher;
+import javax.crypto.Mac;
 
 /**
  * A class that coordinates access to the fingerprint hardware.
@@ -195,18 +196,26 @@
 
     /**
      * A wrapper class for the crypto objects supported by FingerprintManager. Currently the
-     * framework supports {@link Signature} and {@link Cipher} objects.
+     * framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects.
      */
     public static class CryptoObject {
 
-        public CryptoObject(Signature signature) {
+        public CryptoObject(@NonNull Signature signature) {
             mSignature = signature;
             mCipher = null;
+            mMac = null;
         }
 
-        public CryptoObject(Cipher cipher) {
+        public CryptoObject(@NonNull Cipher cipher) {
             mCipher = cipher;
             mSignature = null;
+            mMac = null;
+        }
+
+        public CryptoObject(@NonNull Mac mac) {
+            mMac = mac;
+            mCipher = null;
+            mSignature = null;
         }
 
         /**
@@ -222,6 +231,12 @@
         public Cipher getCipher() { return mCipher; }
 
         /**
+         * Get {@link Mac} object.
+         * @return {@link Mac} object or null if this doesn't contain one.
+         */
+        public Mac getMac() { return mMac; }
+
+        /**
          * @hide
          * @return the opId associated with this object or 0 if none
          */
@@ -230,12 +245,15 @@
                 return AndroidKeyStoreProvider.getKeyStoreOperationHandle(mSignature);
             } else if (mCipher != null) {
                 return AndroidKeyStoreProvider.getKeyStoreOperationHandle(mCipher);
+            } else if (mMac != null) {
+                return AndroidKeyStoreProvider.getKeyStoreOperationHandle(mMac);
             }
             return 0;
         }
 
         private final Signature mSignature;
         private final Cipher mCipher;
+        private final Mac mMac;
     };
 
     /**