1 /* 2 * Copyright (C) 2013 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.example.inputmanagercompat; 18 19 import android.content.Context; 20 import android.os.Build; 21 import android.os.Handler; 22 import android.view.InputDevice; 23 import android.view.MotionEvent; 24 25 public interface InputManagerCompat { 26 /** 27 * Gets information about the input device with the specified id. 28 * 29 * @param id The device id 30 * @return The input device or null if not found 31 */ 32 public InputDevice getInputDevice(int id); 33 34 /** 35 * Gets the ids of all input devices in the system. 36 * 37 * @return The input device ids. 38 */ 39 public int[] getInputDeviceIds(); 40 41 /** 42 * Registers an input device listener to receive notifications about when 43 * input devices are added, removed or changed. 44 * 45 * @param listener The listener to register. 46 * @param handler The handler on which the listener should be invoked, or 47 * null if the listener should be invoked on the calling thread's 48 * looper. 49 */ 50 public void registerInputDeviceListener(InputManagerCompat.InputDeviceListener listener, 51 Handler handler); 52 53 /** 54 * Unregisters an input device listener. 55 * 56 * @param listener The listener to unregister. 57 */ 58 public void unregisterInputDeviceListener(InputManagerCompat.InputDeviceListener listener); 59 60 /* 61 * The following three calls are to simulate V16 behavior on pre-Jellybean 62 * devices. If you don't call them, your callback will never be called 63 * pre-API 16. 64 */ 65 66 /** 67 * Pass the motion events to the InputManagerCompat. This is used to 68 * optimize for polling for controllers. If you do not pass these events in, 69 * polling will cause regular object creation. 70 * 71 * @param event the motion event from the app 72 */ 73 public void onGenericMotionEvent(MotionEvent event); 74 75 /** 76 * Tell the V9 input manager that it should stop polling for disconnected 77 * devices. You can call this during onPause in your activity, although you 78 * might want to call it whenever your game is not active (or whenever you 79 * don't care about being notified of new input devices) 80 */ 81 public void onPause(); 82 83 /** 84 * Tell the V9 input manager that it should start polling for disconnected 85 * devices. You can call this during onResume in your activity, although you 86 * might want to call it less often (only when the gameplay is actually 87 * active) 88 */ 89 public void onResume(); 90 91 public interface InputDeviceListener { 92 /** 93 * Called whenever the input manager detects that a device has been 94 * added. This will only be called in the V9 version when a motion event 95 * is detected. 96 * 97 * @param deviceId The id of the input device that was added. 98 */ 99 void onInputDeviceAdded(int deviceId); 100 101 /** 102 * Called whenever the properties of an input device have changed since 103 * they were last queried. This will not be called for the V9 version of 104 * the API. 105 * 106 * @param deviceId The id of the input device that changed. 107 */ 108 void onInputDeviceChanged(int deviceId); 109 110 /** 111 * Called whenever the input manager detects that a device has been 112 * removed. For the V9 version, this can take some time depending on the 113 * poll rate. 114 * 115 * @param deviceId The id of the input device that was removed. 116 */ 117 void onInputDeviceRemoved(int deviceId); 118 } 119 120 /** 121 * Use this to construct a compatible InputManager. 122 */ 123 public static class Factory { 124 125 /** 126 * Constructs and returns a compatible InputManger 127 * 128 * @param context the Context that will be used to get the system 129 * service from 130 * @return a compatible implementation of InputManager 131 */ 132 public static InputManagerCompat getInputManager(Context context) { 133 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 134 return new InputManagerV16(context); 135 } else { 136 return new InputManagerV9(); 137 } 138 } 139 } 140 } 141