1 /*
2  * Copyright (C) 2021 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.systemui.classifier;
18 
19 import static com.google.common.truth.Truth.assertWithMessage;
20 
21 import android.net.Uri;
22 
23 import com.android.internal.annotations.VisibleForTesting;
24 import com.android.systemui.dagger.SysUISingleton;
25 import com.android.systemui.plugins.FalsingManager;
26 
27 import java.io.PrintWriter;
28 import java.util.ArrayList;
29 import java.util.List;
30 
31 import javax.inject.Inject;
32 
33 /**
34  * Simple Fake for testing where {@link FalsingManager} is required.
35  */
36 @SysUISingleton
37 public class FalsingManagerFake implements FalsingManager {
38     private boolean mIsFalseTouch;
39     private boolean mIsSimpleTap;
40     private boolean mIsFalseDoubleTap;
41     private boolean mIsUnlockingDisabled;
42     private boolean mIsClassifierEnabled;
43     private boolean mShouldEnforceBouncer;
44     private boolean mIsReportingEnabled;
45     private boolean mIsFalseRobustTap;
46     private boolean mIsFalseLongTap;
47     private boolean mDestroyed;
48     private boolean mIsProximityNear;
49 
50     private final List<FalsingBeliefListener> mFalsingBeliefListeners = new ArrayList<>();
51     private final List<FalsingTapListener> mTapListeners = new ArrayList<>();
52 
53     @Inject
FalsingManagerFake()54     public FalsingManagerFake() {
55     }
56 
57     @Override
onSuccessfulUnlock()58     public void onSuccessfulUnlock() {
59 
60     }
61 
62     @VisibleForTesting
setIsUnlockingDisabled(boolean isUnlockingDisabled)63     public void setIsUnlockingDisabled(boolean isUnlockingDisabled) {
64         mIsUnlockingDisabled = isUnlockingDisabled;
65     }
66 
67     @Override
isUnlockingDisabled()68     public boolean isUnlockingDisabled() {
69         return mIsUnlockingDisabled;
70     }
71 
72     @VisibleForTesting
setIsFalseTouch(boolean isFalseTouch)73     public void setIsFalseTouch(boolean isFalseTouch) {
74         mIsFalseTouch = isFalseTouch;
75     }
76 
77     @Override
isFalseTouch(@lassifier.InteractionType int interactionType)78     public boolean isFalseTouch(@Classifier.InteractionType int interactionType) {
79         checkDestroyed();
80         return mIsFalseTouch;
81     }
82 
setFalseTap(boolean falseRobustTap)83     public void setFalseTap(boolean falseRobustTap) {
84         mIsFalseRobustTap = falseRobustTap;
85     }
86 
setSimpleTap(boolean isSimpleTape)87     public void setSimpleTap(boolean isSimpleTape) {
88         mIsSimpleTap = isSimpleTape;
89     }
90 
setFalseDoubleTap(boolean falseDoubleTap)91     public void setFalseDoubleTap(boolean falseDoubleTap) {
92         mIsFalseDoubleTap = falseDoubleTap;
93     }
94 
setIsProximityNear(boolean proxNear)95     public void setIsProximityNear(boolean proxNear) {
96         mIsProximityNear = proxNear;
97     }
98 
setFalseLongTap(boolean falseLongTap)99     public void setFalseLongTap(boolean falseLongTap) {
100         mIsFalseLongTap = falseLongTap;
101     }
102 
103     @Override
isSimpleTap()104     public boolean isSimpleTap() {
105         checkDestroyed();
106         return mIsSimpleTap;
107     }
108 
109     @Override
isFalseTap(@enalty int penalty)110     public boolean isFalseTap(@Penalty int penalty) {
111         checkDestroyed();
112         return mIsFalseRobustTap;
113     }
114 
115     @Override
isFalseLongTap(int penalty)116     public boolean isFalseLongTap(int penalty) {
117         checkDestroyed();
118         return mIsFalseLongTap;
119     }
120 
121     @Override
isFalseDoubleTap()122     public boolean isFalseDoubleTap() {
123         checkDestroyed();
124         return mIsFalseDoubleTap;
125     }
126 
127     @Override
isProximityNear()128     public boolean isProximityNear() {
129         return mIsProximityNear;
130     }
131 
132     @VisibleForTesting
setIsClassifierEnabled(boolean isClassifierEnabled)133     public void setIsClassifierEnabled(boolean isClassifierEnabled) {
134         mIsClassifierEnabled = isClassifierEnabled;
135     }
136 
137     @Override
isClassifierEnabled()138     public boolean isClassifierEnabled() {
139         return mIsClassifierEnabled;
140     }
141 
142     @Override
shouldEnforceBouncer()143     public boolean shouldEnforceBouncer() {
144         return mShouldEnforceBouncer;
145     }
146 
147     @Override
reportRejectedTouch()148     public Uri reportRejectedTouch() {
149         return null;
150     }
151 
152     @VisibleForTesting
setIsReportingEnabled(boolean isReportingEnabled)153     public void setIsReportingEnabled(boolean isReportingEnabled) {
154         mIsReportingEnabled = isReportingEnabled;
155     }
156 
157     @Override
isReportingEnabled()158     public boolean isReportingEnabled() {
159         return mIsReportingEnabled;
160     }
161 
162     @Override
dump(PrintWriter pw, String[] args)163     public void dump(PrintWriter pw, String[] args) {
164     }
165 
166     @Override
cleanupInternal()167     public void cleanupInternal() {
168         mDestroyed = true;
169     }
170 
checkDestroyed()171     private void checkDestroyed() {
172         assertWithMessage("FakeFasingManager has been destroyed")
173                 .that(mDestroyed).isFalse();
174     }
175 
176     @Override
onProximityEvent(ProximityEvent proximityEvent)177     public void onProximityEvent(ProximityEvent proximityEvent) {
178 
179     }
180 
181     @Override
addFalsingBeliefListener(FalsingBeliefListener listener)182     public void addFalsingBeliefListener(FalsingBeliefListener listener) {
183         mFalsingBeliefListeners.add(listener);
184     }
185 
186     @Override
removeFalsingBeliefListener(FalsingBeliefListener listener)187     public void removeFalsingBeliefListener(FalsingBeliefListener listener) {
188         mFalsingBeliefListeners.remove(listener);
189     }
190 
191     @Override
addTapListener(FalsingTapListener falsingTapListener)192     public void addTapListener(FalsingTapListener falsingTapListener) {
193         mTapListeners.add(falsingTapListener);
194     }
195 
196     @Override
removeTapListener(FalsingTapListener falsingTapListener)197     public void removeTapListener(FalsingTapListener falsingTapListener) {
198         mTapListeners.remove(falsingTapListener);
199     }
200 
getTapListeners()201     public List<FalsingTapListener> getTapListeners() {
202         return mTapListeners;
203     }
204 
205     /**
206      * Calls every registered {@link FalsingBeliefListener} as if false touch occurred.
207      */
sendFalsingBelief()208     public void sendFalsingBelief() {
209         for (FalsingBeliefListener listener : mFalsingBeliefListeners) {
210             listener.onFalse();
211         }
212     }
213 }
214