/*
 * Copyright (C) 2015 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 android.annotation.IntDef;
import android.hardware.SensorEvent;
import android.view.MotionEvent;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * An abstract class for classifiers for touch and sensor events.
 */
public abstract class Classifier {
    public static final int QUICK_SETTINGS = 0;
    public static final int NOTIFICATION_DISMISS = 1;
    public static final int NOTIFICATION_DRAG_DOWN = 2;
    public static final int NOTIFICATION_DOUBLE_TAP = 3;
    public static final int UNLOCK = 4;
    public static final int LEFT_AFFORDANCE = 5;
    public static final int RIGHT_AFFORDANCE = 6;
    public static final int GENERIC = 7;
    public static final int BOUNCER_UNLOCK = 8;
    public static final int PULSE_EXPAND = 9;

    @IntDef({
            QUICK_SETTINGS,
            NOTIFICATION_DISMISS,
            NOTIFICATION_DRAG_DOWN,
            NOTIFICATION_DOUBLE_TAP,
            UNLOCK,
            LEFT_AFFORDANCE,
            RIGHT_AFFORDANCE,
            GENERIC,
            BOUNCER_UNLOCK,
            PULSE_EXPAND
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface InteractionType {}

    /**
     * Contains all the information about touch events from which the classifier can query
     */
    protected ClassifierData mClassifierData;

    /**
     * Informs the classifier that a new touch event has occurred
     */
    public void onTouchEvent(MotionEvent event) {
    }

    /**
     * Informs the classifier that a sensor change occurred
     */
    public void onSensorChanged(SensorEvent event) {
    }

    public abstract String getTag();
}
