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