blob: f040712706cd8a7026c59d6a103f5f1637b0ef33 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.classifier;
import static com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK;
import static com.android.systemui.classifier.Classifier.BRIGHTNESS_SLIDER;
import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE;
import static com.android.systemui.classifier.Classifier.NOTIFICATION_DISMISS;
import static com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN;
import static com.android.systemui.classifier.Classifier.PULSE_EXPAND;
import static com.android.systemui.classifier.Classifier.QS_COLLAPSE;
import static com.android.systemui.classifier.Classifier.QS_SWIPE;
import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS;
import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE;
import static com.android.systemui.classifier.Classifier.SHADE_DRAG;
import static com.android.systemui.classifier.Classifier.UNLOCK;
import javax.inject.Inject;
/**
* Ensure that the swipe direction generally matches that of the interaction type.
*/
public class TypeClassifier extends FalsingClassifier {
@Inject
TypeClassifier(FalsingDataProvider dataProvider) {
super(dataProvider);
}
@Override
Result calculateFalsingResult(
@Classifier.InteractionType int interactionType,
double historyBelief, double historyConfidence) {
if (interactionType == Classifier.UDFPS_AUTHENTICATION
|| interactionType == Classifier.LOCK_ICON) {
return Result.passed(0);
}
boolean vertical = isVertical();
boolean up = isUp();
boolean right = isRight();
double confidence = 1;
boolean wrongDirection = true;
switch (interactionType) {
case QUICK_SETTINGS:
case PULSE_EXPAND:
case NOTIFICATION_DRAG_DOWN:
wrongDirection = !vertical || up;
break;
case BRIGHTNESS_SLIDER:
confidence = 0; // Owners may return to original brightness.
// A more sophisticated thing to do here would be to look at the size of the
// vertical change relative to the screen size. _Some_ amount of vertical
// change should be expected.
case NOTIFICATION_DISMISS:
wrongDirection = vertical;
break;
case UNLOCK:
case BOUNCER_UNLOCK:
wrongDirection = !vertical || !up;
break;
case LEFT_AFFORDANCE: // Swiping from the bottom left corner for camera or similar.
wrongDirection = !right || !up;
break;
case RIGHT_AFFORDANCE: // Swiping from the bottom right corner for camera or similar.
wrongDirection = right || !up;
break;
case SHADE_DRAG:
wrongDirection = !vertical;
break;
case QS_COLLAPSE:
wrongDirection = !vertical || !up;
break;
case QS_SWIPE:
wrongDirection = vertical;
break;
default:
wrongDirection = true;
break;
}
return wrongDirection ? falsed(confidence, getReason(interactionType)) : Result.passed(0.5);
}
private String getReason(int interactionType) {
return String.format("{interaction=%s, vertical=%s, up=%s, right=%s}",
interactionType, isVertical(), isUp(), isRight());
}
}