InputConsumerImpl.java revision f83e824216435e45f36a3587e269888f791b2a01
1df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn/* 2df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * Copyright (C) 2011 The Android Open Source Project 3df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * 4df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * you may not use this file except in compliance with the License. 6df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * You may obtain a copy of the License at 7df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * 8df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * 10df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * See the License for the specific language governing permissions and 14df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * limitations under the License. 15df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn */ 16df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 17df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackbornpackage com.android.server.wm; 18df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 19df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackbornimport android.os.Looper; 20df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackbornimport android.os.Process; 2159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display; 22df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackbornimport android.view.InputChannel; 2332cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brownimport android.view.InputEventReceiver; 24f83e824216435e45f36a3587e269888f791b2a01Selim Cinekimport android.view.WindowManager; 25df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackbornimport android.view.WindowManagerPolicy; 26df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 27f83e824216435e45f36a3587e269888f791b2a01Selim Cinekimport com.android.server.input.InputApplicationHandle; 28f83e824216435e45f36a3587e269888f791b2a01Selim Cinekimport com.android.server.input.InputWindowHandle; 29f83e824216435e45f36a3587e269888f791b2a01Selim Cinek 30f83e824216435e45f36a3587e269888f791b2a01Selim Cinekpublic final class InputConsumerImpl implements WindowManagerPolicy.InputConsumer { 31df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn final WindowManagerService mService; 32df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn final InputChannel mServerChannel, mClientChannel; 33df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn final InputApplicationHandle mApplicationHandle; 34df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn final InputWindowHandle mWindowHandle; 3532cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown final InputEventReceiver mInputEventReceiver; 36df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn final int mWindowLayer; 37df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 38f83e824216435e45f36a3587e269888f791b2a01Selim Cinek public InputConsumerImpl(WindowManagerService service, Looper looper, 39f83e824216435e45f36a3587e269888f791b2a01Selim Cinek InputEventReceiver.Factory inputEventReceiverFactory) { 40f83e824216435e45f36a3587e269888f791b2a01Selim Cinek String name = "input consumer"; 41df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mService = service; 42df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 43df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn InputChannel[] channels = InputChannel.openInputChannelPair(name); 44df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mServerChannel = channels[0]; 45df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mClientChannel = channels[1]; 46df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mService.mInputManager.registerInputChannel(mServerChannel, null); 4732cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown 4832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown mInputEventReceiver = inputEventReceiverFactory.createInputEventReceiver( 4932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown mClientChannel, looper); 50df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 51df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mApplicationHandle = new InputApplicationHandle(null); 52df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mApplicationHandle.name = name; 53df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mApplicationHandle.dispatchingTimeoutNanos = 54df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; 55df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 5659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner mWindowHandle = new InputWindowHandle(mApplicationHandle, null, Display.DEFAULT_DISPLAY); 57df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.name = name; 58df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.inputChannel = mServerChannel; 59f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mWindowHandle.layoutParamsType = WindowManager.LayoutParams.TYPE_INPUT_CONSUMER; 60f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mWindowLayer = getLayerLw(mWindowHandle.layoutParamsType); 61df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.layer = mWindowLayer; 62f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mWindowHandle.layoutParamsFlags = 0; 63df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.dispatchingTimeoutNanos = 64df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS; 65df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.visible = true; 66f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mWindowHandle.canReceiveKeys = false; 67f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mWindowHandle.hasFocus = false; 68df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.hasWallpaper = false; 69df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.paused = false; 70df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.ownerPid = Process.myPid(); 71df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.ownerUid = Process.myUid(); 72df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.inputFeatures = 0; 73df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.scaleFactor = 1.0f; 74df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 75df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 76df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn void layout(int dw, int dh) { 77f83e824216435e45f36a3587e269888f791b2a01Selim Cinek mWindowHandle.touchableRegion.set(0, 0, dw, dh); 78df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.frameLeft = 0; 79df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.frameTop = 0; 80df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.frameRight = dw; 81df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mWindowHandle.frameBottom = dh; 82df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 83df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 84df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn @Override 85df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn public void dismiss() { 86df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn synchronized (mService.mWindowMap) { 87f83e824216435e45f36a3587e269888f791b2a01Selim Cinek if (mService.removeInputConsumer()) { 8832cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown mInputEventReceiver.dispose(); 89df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mService.mInputManager.unregisterInputChannel(mServerChannel); 90df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mClientChannel.dispose(); 91df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn mServerChannel.dispose(); 92df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 93df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 94df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 95df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn 96df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn private int getLayerLw(int windowType) { 97df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn return mService.mPolicy.windowTypeToLayerLw(windowType) 98df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn * WindowManagerService.TYPE_LAYER_MULTIPLIER 99df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn + WindowManagerService.TYPE_LAYER_OFFSET; 100df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn } 101df89e65bf0fcc651d20b208c8d8d0b848fb43418Dianne Hackborn} 102