Home | History | Annotate | Download | only in inputflinger
      1 /*
      2  * Copyright (C) 2011 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 #ifndef _UI_INPUT_LISTENER_H
     18 #define _UI_INPUT_LISTENER_H
     19 
     20 #include <input/Input.h>
     21 #include <utils/RefBase.h>
     22 #include <utils/Vector.h>
     23 
     24 namespace android {
     25 
     26 class InputListenerInterface;
     27 
     28 
     29 /* Superclass of all input event argument objects */
     30 struct NotifyArgs {
     31     virtual ~NotifyArgs() { }
     32 
     33     virtual void notify(const sp<InputListenerInterface>& listener) const = 0;
     34 };
     35 
     36 
     37 /* Describes a configuration change event. */
     38 struct NotifyConfigurationChangedArgs : public NotifyArgs {
     39     nsecs_t eventTime;
     40 
     41     inline NotifyConfigurationChangedArgs() { }
     42 
     43     explicit NotifyConfigurationChangedArgs(nsecs_t eventTime);
     44 
     45     NotifyConfigurationChangedArgs(const NotifyConfigurationChangedArgs& other);
     46 
     47     virtual ~NotifyConfigurationChangedArgs() { }
     48 
     49     virtual void notify(const sp<InputListenerInterface>& listener) const;
     50 };
     51 
     52 
     53 /* Describes a key event. */
     54 struct NotifyKeyArgs : public NotifyArgs {
     55     nsecs_t eventTime;
     56     int32_t deviceId;
     57     uint32_t source;
     58     uint32_t policyFlags;
     59     int32_t action;
     60     int32_t flags;
     61     int32_t keyCode;
     62     int32_t scanCode;
     63     int32_t metaState;
     64     nsecs_t downTime;
     65 
     66     inline NotifyKeyArgs() { }
     67 
     68     NotifyKeyArgs(nsecs_t eventTime, int32_t deviceId, uint32_t source, uint32_t policyFlags,
     69             int32_t action, int32_t flags, int32_t keyCode, int32_t scanCode,
     70             int32_t metaState, nsecs_t downTime);
     71 
     72     NotifyKeyArgs(const NotifyKeyArgs& other);
     73 
     74     virtual ~NotifyKeyArgs() { }
     75 
     76     virtual void notify(const sp<InputListenerInterface>& listener) const;
     77 };
     78 
     79 
     80 /* Describes a motion event. */
     81 struct NotifyMotionArgs : public NotifyArgs {
     82     nsecs_t eventTime;
     83     int32_t deviceId;
     84     uint32_t source;
     85     uint32_t policyFlags;
     86     int32_t action;
     87     int32_t actionButton;
     88     int32_t flags;
     89     int32_t metaState;
     90     int32_t buttonState;
     91     int32_t edgeFlags;
     92     int32_t displayId;
     93     /**
     94      * A timestamp in the input device's time base, not the platform's.
     95      * The units are microseconds since the last reset.
     96      * This can only be compared to other device timestamps from the same device.
     97      * This value will overflow after a little over an hour.
     98      */
     99     uint32_t deviceTimestamp;
    100     uint32_t pointerCount;
    101     PointerProperties pointerProperties[MAX_POINTERS];
    102     PointerCoords pointerCoords[MAX_POINTERS];
    103     float xPrecision;
    104     float yPrecision;
    105     nsecs_t downTime;
    106 
    107     inline NotifyMotionArgs() { }
    108 
    109     NotifyMotionArgs(nsecs_t eventTime, int32_t deviceId, uint32_t source, uint32_t policyFlags,
    110             int32_t action, int32_t actionButton, int32_t flags,
    111             int32_t metaState, int32_t buttonState,
    112             int32_t edgeFlags, int32_t displayId, uint32_t deviceTimestamp, uint32_t pointerCount,
    113             const PointerProperties* pointerProperties, const PointerCoords* pointerCoords,
    114             float xPrecision, float yPrecision, nsecs_t downTime);
    115 
    116     NotifyMotionArgs(const NotifyMotionArgs& other);
    117 
    118     virtual ~NotifyMotionArgs() { }
    119 
    120     virtual void notify(const sp<InputListenerInterface>& listener) const;
    121 };
    122 
    123 
    124 /* Describes a switch event. */
    125 struct NotifySwitchArgs : public NotifyArgs {
    126     nsecs_t eventTime;
    127     uint32_t policyFlags;
    128     uint32_t switchValues;
    129     uint32_t switchMask;
    130 
    131     inline NotifySwitchArgs() { }
    132 
    133     NotifySwitchArgs(nsecs_t eventTime, uint32_t policyFlags,
    134             uint32_t switchValues, uint32_t switchMask);
    135 
    136     NotifySwitchArgs(const NotifySwitchArgs& other);
    137 
    138     virtual ~NotifySwitchArgs() { }
    139 
    140     virtual void notify(const sp<InputListenerInterface>& listener) const;
    141 };
    142 
    143 
    144 /* Describes a device reset event, such as when a device is added,
    145  * reconfigured, or removed. */
    146 struct NotifyDeviceResetArgs : public NotifyArgs {
    147     nsecs_t eventTime;
    148     int32_t deviceId;
    149 
    150     inline NotifyDeviceResetArgs() { }
    151 
    152     NotifyDeviceResetArgs(nsecs_t eventTime, int32_t deviceId);
    153 
    154     NotifyDeviceResetArgs(const NotifyDeviceResetArgs& other);
    155 
    156     virtual ~NotifyDeviceResetArgs() { }
    157 
    158     virtual void notify(const sp<InputListenerInterface>& listener) const;
    159 };
    160 
    161 
    162 /*
    163  * The interface used by the InputReader to notify the InputListener about input events.
    164  */
    165 class InputListenerInterface : public virtual RefBase {
    166 protected:
    167     InputListenerInterface() { }
    168     virtual ~InputListenerInterface() { }
    169 
    170 public:
    171     virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args) = 0;
    172     virtual void notifyKey(const NotifyKeyArgs* args) = 0;
    173     virtual void notifyMotion(const NotifyMotionArgs* args) = 0;
    174     virtual void notifySwitch(const NotifySwitchArgs* args) = 0;
    175     virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args) = 0;
    176 };
    177 
    178 
    179 /*
    180  * An implementation of the listener interface that queues up and defers dispatch
    181  * of decoded events until flushed.
    182  */
    183 class QueuedInputListener : public InputListenerInterface {
    184 protected:
    185     virtual ~QueuedInputListener();
    186 
    187 public:
    188     explicit QueuedInputListener(const sp<InputListenerInterface>& innerListener);
    189 
    190     virtual void notifyConfigurationChanged(const NotifyConfigurationChangedArgs* args);
    191     virtual void notifyKey(const NotifyKeyArgs* args);
    192     virtual void notifyMotion(const NotifyMotionArgs* args);
    193     virtual void notifySwitch(const NotifySwitchArgs* args);
    194     virtual void notifyDeviceReset(const NotifyDeviceResetArgs* args);
    195 
    196     void flush();
    197 
    198 private:
    199     sp<InputListenerInterface> mInnerListener;
    200     Vector<NotifyArgs*> mArgsQueue;
    201 };
    202 
    203 } // namespace android
    204 
    205 #endif // _UI_INPUT_LISTENER_H
    206