1 /**
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.fingerprint;
18 
19 import android.content.Context;
20 import android.hardware.fingerprint.FingerprintManager;
21 import android.hardware.fingerprint.IFingerprintDaemon;
22 import android.hardware.fingerprint.IFingerprintServiceReceiver;
23 import android.os.IBinder;
24 import android.os.RemoteException;
25 import android.os.UserHandle;
26 import android.util.Slog;
27 
28 /**
29  * A class to keep track of the remove state for a given client.
30  */
31 public abstract class RemovalClient extends ClientMonitor {
32     private int mFingerId;
33 
RemovalClient(Context context, long halDeviceId, IBinder token, IFingerprintServiceReceiver receiver, int fingerId, int groupId, int userId, boolean restricted, String owner)34     public RemovalClient(Context context, long halDeviceId, IBinder token,
35             IFingerprintServiceReceiver receiver, int fingerId, int groupId, int userId,
36             boolean restricted, String owner) {
37         super(context, halDeviceId, token, receiver, userId, groupId, restricted, owner);
38         mFingerId = fingerId;
39     }
40 
41     @Override
start()42     public int start() {
43         IFingerprintDaemon daemon = getFingerprintDaemon();
44         // The fingerprint template ids will be removed when we get confirmation from the HAL
45         try {
46             final int result = daemon.remove(mFingerId, getGroupId());
47             if (result != 0) {
48                 Slog.w(TAG, "startRemove with id = " + mFingerId + " failed, result=" + result);
49                 onError(FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE);
50                 return result;
51             }
52         } catch (RemoteException e) {
53             Slog.e(TAG, "startRemove failed", e);
54         }
55         return 0;
56     }
57 
58     @Override
stop(boolean initiatedByClient)59     public int stop(boolean initiatedByClient) {
60         // We don't actually stop remove, but inform the client that the cancel operation succeeded
61         // so we can start the next operation.
62         if (initiatedByClient) {
63             onError(FingerprintManager.FINGERPRINT_ERROR_CANCELED);
64         }
65         return 0;
66     }
67 
68     /*
69      * @return true if we're done.
70      */
sendRemoved(int fingerId, int groupId)71     private boolean sendRemoved(int fingerId, int groupId) {
72         IFingerprintServiceReceiver receiver = getReceiver();
73         try {
74             if (receiver != null) {
75                 receiver.onRemoved(getHalDeviceId(), fingerId, groupId);
76             }
77         } catch (RemoteException e) {
78             Slog.w(TAG, "Failed to notify Removed:", e);
79         }
80         return fingerId == 0;
81     }
82 
83     @Override
onRemoved(int fingerId, int groupId)84     public boolean onRemoved(int fingerId, int groupId) {
85         if (fingerId != 0) {
86             FingerprintUtils.getInstance().removeFingerprintIdForUser(getContext(), fingerId,
87                     getTargetUserId());
88         }
89         return sendRemoved(fingerId, getGroupId());
90     }
91 
92     @Override
onEnrollResult(int fingerId, int groupId, int rem)93     public boolean onEnrollResult(int fingerId, int groupId, int rem) {
94         if (DEBUG) Slog.w(TAG, "onEnrollResult() called for remove!");
95         return true; // Invalid for Remove
96     }
97 
98     @Override
onAuthenticated(int fingerId, int groupId)99     public boolean onAuthenticated(int fingerId, int groupId) {
100         if (DEBUG) Slog.w(TAG, "onAuthenticated() called for remove!");
101         return true; // Invalid for Remove.
102     }
103 
104     @Override
onEnumerationResult(int fingerId, int groupId)105     public boolean onEnumerationResult(int fingerId, int groupId) {
106         if (DEBUG) Slog.w(TAG, "onEnumerationResult() called for remove!");
107         return false; // Invalid for Remove.
108     }
109 
110 
111 }
112