Home | History | Annotate | Download | only in view
      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 package android.view;
     18 
     19 import static android.view.Display.INVALID_DISPLAY;
     20 
     21 import android.annotation.Nullable;
     22 import android.graphics.Region;
     23 import android.os.IBinder;
     24 
     25 import java.lang.ref.WeakReference;
     26 
     27 /**
     28  * Functions as a handle for a window that can receive input.
     29  * Enables the native input dispatcher to refer indirectly to the window manager's window state.
     30  * @hide
     31  */
     32 public final class InputWindowHandle {
     33     // Pointer to the native input window handle.
     34     // This field is lazily initialized via JNI.
     35     @SuppressWarnings("unused")
     36     private long ptr;
     37 
     38     // The input application handle.
     39     public final InputApplicationHandle inputApplicationHandle;
     40 
     41     // The client window.
     42     public final IWindow clientWindow;
     43 
     44     // The token associated with the window.
     45     public IBinder token;
     46 
     47     // The window name.
     48     public String name;
     49 
     50     // Window layout params attributes.  (WindowManager.LayoutParams)
     51     public int layoutParamsFlags;
     52     public int layoutParamsType;
     53 
     54     // Dispatching timeout.
     55     public long dispatchingTimeoutNanos;
     56 
     57     // Window frame.
     58     public int frameLeft;
     59     public int frameTop;
     60     public int frameRight;
     61     public int frameBottom;
     62 
     63     public int surfaceInset;
     64 
     65     // Global scaling factor applied to touch events when they are dispatched
     66     // to the window
     67     public float scaleFactor;
     68 
     69     // Window touchable region.
     70     public final Region touchableRegion = new Region();
     71 
     72     // Window is visible.
     73     public boolean visible;
     74 
     75     // Window can receive keys.
     76     public boolean canReceiveKeys;
     77 
     78     // Window has focus.
     79     public boolean hasFocus;
     80 
     81     // Window has wallpaper.  (window is the current wallpaper target)
     82     public boolean hasWallpaper;
     83 
     84     // Input event dispatching is paused.
     85     public boolean paused;
     86 
     87     // Window layer.
     88     public int layer;
     89 
     90     // Id of process and user that owns the window.
     91     public int ownerPid;
     92     public int ownerUid;
     93 
     94     // Window input features.
     95     public int inputFeatures;
     96 
     97     // Display this input is on.
     98     public int displayId;
     99 
    100     // If this value is set to a valid display ID, it indicates this window is a portal which
    101     // transports the touch of this window to the display indicated by portalToDisplayId.
    102     public int portalToDisplayId = INVALID_DISPLAY;
    103 
    104     /**
    105      * Crops the touchable region to the bounds of the surface provided.
    106      *
    107      * This can be used in cases where the window is not
    108      * {@link android.view.WindowManager#FLAG_NOT_TOUCH_MODAL} but should be constrained to the
    109      * bounds of a parent window. That is the window should receive touch events outside its
    110      * window but be limited to its stack bounds, such as in the case of split screen.
    111      */
    112     public WeakReference<IBinder> touchableRegionCropHandle = new WeakReference<>(null);
    113 
    114     /**
    115      * Replace {@link touchableRegion} with the bounds of {@link touchableRegionCropHandle}. If
    116      * the handle is {@code null}, the bounds of the surface associated with this window is used
    117      * as the touchable region.
    118      */
    119     public boolean replaceTouchableRegionWithCrop;
    120 
    121     private native void nativeDispose();
    122 
    123     public InputWindowHandle(InputApplicationHandle inputApplicationHandle,
    124             IWindow clientWindow, int displayId) {
    125         this.inputApplicationHandle = inputApplicationHandle;
    126         this.clientWindow = clientWindow;
    127         this.displayId = displayId;
    128     }
    129 
    130     @Override
    131     public String toString() {
    132         return new StringBuilder(name != null ? name : "")
    133                 .append(", layer=").append(layer)
    134                 .append(", frame=[").append(frameLeft).append(",").append(frameTop).append(",")
    135                         .append(frameRight).append(",").append(frameBottom).append("]")
    136                 .append(", touchableRegion=").append(touchableRegion)
    137                 .append(", visible=").append(visible)
    138                 .toString();
    139 
    140     }
    141 
    142     @Override
    143     protected void finalize() throws Throwable {
    144         try {
    145             nativeDispose();
    146         } finally {
    147             super.finalize();
    148         }
    149     }
    150 
    151     /**
    152      * Set the window touchable region to the bounds of {@link touchableRegionBounds} ignoring any
    153      * touchable region provided.
    154      *
    155      * @param bounds surface to set the touchable region to. Set to {@code null} to set the bounds
    156      * to the current surface.
    157      */
    158     public void replaceTouchableRegionWithCrop(@Nullable SurfaceControl bounds) {
    159         setTouchableRegionCrop(bounds);
    160         replaceTouchableRegionWithCrop = true;
    161     }
    162 
    163     /**
    164      * Crop the window touchable region to the bounds of the surface provided.
    165      */
    166     public void setTouchableRegionCrop(@Nullable SurfaceControl bounds) {
    167         if (bounds != null) {
    168             touchableRegionCropHandle = new WeakReference<>(bounds.getHandle());
    169         }
    170     }
    171 }
    172