1 /* 2 * Copyright (C) 2017 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.android.server.wm; 18 19 import android.annotation.NonNull; 20 import android.annotation.Nullable; 21 import android.content.ClipData; 22 import android.graphics.Rect; 23 import android.graphics.Region; 24 import android.hardware.display.DisplayManagerInternal; 25 import android.os.IBinder; 26 import android.view.Display; 27 import android.view.IInputFilter; 28 import android.view.IWindow; 29 import android.view.InputChannel; 30 import android.view.MagnificationSpec; 31 import android.view.WindowInfo; 32 33 import com.android.server.input.InputManagerService; 34 import com.android.server.policy.WindowManagerPolicy; 35 36 import java.util.List; 37 38 /** 39 * Window manager local system service interface. 40 * 41 * @hide Only for use within the system server. 42 */ 43 public abstract class WindowManagerInternal { 44 45 /** 46 * Interface to receive a callback when the windows reported for 47 * accessibility changed. 48 */ 49 public interface WindowsForAccessibilityCallback { 50 51 /** 52 * Called when the windows for accessibility changed. 53 * 54 * @param windows The windows for accessibility. 55 */ 56 public void onWindowsForAccessibilityChanged(List<WindowInfo> windows); 57 } 58 59 /** 60 * Callbacks for contextual changes that affect the screen magnification 61 * feature. 62 */ 63 public interface MagnificationCallbacks { 64 65 /** 66 * Called when the region where magnification operates changes. Note that this isn't the 67 * entire screen. For example, IMEs are not magnified. 68 * 69 * @param magnificationRegion the current magnification region 70 */ 71 public void onMagnificationRegionChanged(Region magnificationRegion); 72 73 /** 74 * Called when an application requests a rectangle on the screen to allow 75 * the client to apply the appropriate pan and scale. 76 * 77 * @param left The rectangle left. 78 * @param top The rectangle top. 79 * @param right The rectangle right. 80 * @param bottom The rectangle bottom. 81 */ 82 public void onRectangleOnScreenRequested(int left, int top, int right, int bottom); 83 84 /** 85 * Notifies that the rotation changed. 86 * 87 * @param rotation The current rotation. 88 */ 89 public void onRotationChanged(int rotation); 90 91 /** 92 * Notifies that the context of the user changed. For example, an application 93 * was started. 94 */ 95 public void onUserContextChanged(); 96 } 97 98 /** 99 * Abstract class to be notified about {@link com.android.server.wm.AppTransition} events. Held 100 * as an abstract class so a listener only needs to implement the methods of its interest. 101 */ 102 public static abstract class AppTransitionListener { 103 104 /** 105 * Called when an app transition is being setup and about to be executed. 106 */ 107 public void onAppTransitionPendingLocked() {} 108 109 /** 110 * Called when a pending app transition gets cancelled. 111 * 112 * @param transit transition type indicating what kind of transition got cancelled 113 */ 114 public void onAppTransitionCancelledLocked(int transit) {} 115 116 /** 117 * Called when an app transition gets started 118 * 119 * @param transit transition type indicating what kind of transition gets run, must be one 120 * of AppTransition.TRANSIT_* values 121 * @param openToken the token for the opening app 122 * @param closeToken the token for the closing app 123 * @param duration the total duration of the transition 124 * @param statusBarAnimationStartTime the desired start time for all visual animations in 125 * the status bar caused by this app transition in uptime millis 126 * @param statusBarAnimationDuration the duration for all visual animations in the status 127 * bar caused by this app transition in millis 128 * 129 * @return Return any bit set of {@link WindowManagerPolicy#FINISH_LAYOUT_REDO_LAYOUT}, 130 * {@link WindowManagerPolicy#FINISH_LAYOUT_REDO_CONFIG}, 131 * {@link WindowManagerPolicy#FINISH_LAYOUT_REDO_WALLPAPER}, 132 * or {@link WindowManagerPolicy#FINISH_LAYOUT_REDO_ANIM}. 133 */ 134 public int onAppTransitionStartingLocked(int transit, IBinder openToken, IBinder closeToken, 135 long duration, long statusBarAnimationStartTime, long statusBarAnimationDuration) { 136 return 0; 137 } 138 139 /** 140 * Called when an app transition is finished running. 141 * 142 * @param token the token for app whose transition has finished 143 */ 144 public void onAppTransitionFinishedLocked(IBinder token) {} 145 } 146 147 /** 148 * An interface to be notified about hardware keyboard status. 149 */ 150 public interface OnHardKeyboardStatusChangeListener { 151 public void onHardKeyboardStatusChange(boolean available); 152 } 153 154 /** 155 * An interface to customize drag and drop behaviors. 156 */ 157 public interface IDragDropCallback { 158 default boolean registerInputChannel( 159 DragState state, Display display, InputManagerService service, 160 InputChannel source) { 161 state.register(display); 162 return service.transferTouchFocus(source, state.getInputChannel()); 163 } 164 165 /** 166 * Called when drag operation is starting. 167 */ 168 default boolean prePerformDrag(IWindow window, IBinder dragToken, 169 int touchSource, float touchX, float touchY, float thumbCenterX, float thumbCenterY, 170 ClipData data) { 171 return true; 172 } 173 174 /** 175 * Called when drag operation is started. 176 */ 177 default void postPerformDrag() {} 178 179 /** 180 * Called when drop result is being reported. 181 */ 182 default void preReportDropResult(IWindow window, boolean consumed) {} 183 184 /** 185 * Called when drop result was reported. 186 */ 187 default void postReportDropResult() {} 188 189 /** 190 * Called when drag operation is being cancelled. 191 */ 192 default void preCancelDragAndDrop(IBinder dragToken) {} 193 194 /** 195 * Called when drag operation was cancelled. 196 */ 197 default void postCancelDragAndDrop() {} 198 } 199 200 /** 201 * Request that the window manager call 202 * {@link DisplayManagerInternal#performTraversalInTransactionFromWindowManager} 203 * within a surface transaction at a later time. 204 */ 205 public abstract void requestTraversalFromDisplayManager(); 206 207 /** 208 * Set by the accessibility layer to observe changes in the magnified region, 209 * rotation, and other window transformations related to display magnification 210 * as the window manager is responsible for doing the actual magnification 211 * and has access to the raw window data while the accessibility layer serves 212 * as a controller. 213 * 214 * @param callbacks The callbacks to invoke. 215 */ 216 public abstract void setMagnificationCallbacks(@Nullable MagnificationCallbacks callbacks); 217 218 /** 219 * Set by the accessibility layer to specify the magnification and panning to 220 * be applied to all windows that should be magnified. 221 * 222 * @param spec The MagnficationSpec to set. 223 * 224 * @see #setMagnificationCallbacks(MagnificationCallbacks) 225 */ 226 public abstract void setMagnificationSpec(MagnificationSpec spec); 227 228 /** 229 * Set by the accessibility framework to indicate whether the magnifiable regions of the display 230 * should be shown. 231 * 232 * @param show {@code true} to show magnifiable region bounds, {@code false} to hide 233 */ 234 public abstract void setForceShowMagnifiableBounds(boolean show); 235 236 /** 237 * Obtains the magnification regions. 238 * 239 * @param magnificationRegion the current magnification region 240 */ 241 public abstract void getMagnificationRegion(@NonNull Region magnificationRegion); 242 243 /** 244 * Gets the magnification and translation applied to a window given its token. 245 * Not all windows are magnified and the window manager policy determines which 246 * windows are magnified. The returned result also takes into account the compat 247 * scale if necessary. 248 * 249 * @param windowToken The window's token. 250 * 251 * @return The magnification spec for the window. 252 * 253 * @see #setMagnificationCallbacks(MagnificationCallbacks) 254 */ 255 public abstract MagnificationSpec getCompatibleMagnificationSpecForWindow( 256 IBinder windowToken); 257 258 /** 259 * Sets a callback for observing which windows are touchable for the purposes 260 * of accessibility. 261 * 262 * @param callback The callback. 263 */ 264 public abstract void setWindowsForAccessibilityCallback( 265 WindowsForAccessibilityCallback callback); 266 267 /** 268 * Sets a filter for manipulating the input event stream. 269 * 270 * @param filter The filter implementation. 271 */ 272 public abstract void setInputFilter(IInputFilter filter); 273 274 /** 275 * Gets the token of the window that has input focus. 276 * 277 * @return The token. 278 */ 279 public abstract IBinder getFocusedWindowToken(); 280 281 /** 282 * @return Whether the keyguard is engaged. 283 */ 284 public abstract boolean isKeyguardLocked(); 285 286 /** 287 * @return Whether the keyguard is showing and not occluded. 288 */ 289 public abstract boolean isKeyguardShowingAndNotOccluded(); 290 291 /** 292 * Gets the frame of a window given its token. 293 * 294 * @param token The token. 295 * @param outBounds The frame to populate. 296 */ 297 public abstract void getWindowFrame(IBinder token, Rect outBounds); 298 299 /** 300 * Opens the global actions dialog. 301 */ 302 public abstract void showGlobalActions(); 303 304 /** 305 * Invalidate all visible windows. Then report back on the callback once all windows have 306 * redrawn. 307 */ 308 public abstract void waitForAllWindowsDrawn(Runnable callback, long timeout); 309 310 /** 311 * Adds a window token for a given window type. 312 * 313 * @param token The token to add. 314 * @param type The window type. 315 * @param displayId The display to add the token to. 316 */ 317 public abstract void addWindowToken(android.os.IBinder token, int type, int displayId); 318 319 /** 320 * Removes a window token. 321 * 322 * @param token The toke to remove. 323 * @param removeWindows Whether to also remove the windows associated with the token. 324 * @param displayId The display to remove the token from. 325 */ 326 public abstract void removeWindowToken(android.os.IBinder token, boolean removeWindows, 327 int displayId); 328 329 /** 330 * Registers a listener to be notified about app transition events. 331 * 332 * @param listener The listener to register. 333 */ 334 public abstract void registerAppTransitionListener(AppTransitionListener listener); 335 336 /** 337 * Retrieves a height of input method window. 338 */ 339 public abstract int getInputMethodWindowVisibleHeight(); 340 341 /** 342 * Saves last input method window for transition. 343 * 344 * Note that it is assumed that this method is called only by InputMethodManagerService. 345 */ 346 public abstract void saveLastInputMethodWindowForTransition(); 347 348 /** 349 * Clears last input method window for transition. 350 * 351 * Note that it is assumed that this method is called only by InputMethodManagerService. 352 */ 353 public abstract void clearLastInputMethodWindowForTransition(); 354 355 /** 356 * Notifies WindowManagerService that the current IME window status is being changed. 357 * 358 * <p>Only {@link com.android.server.InputMethodManagerService} is the expected and tested 359 * caller of this method.</p> 360 * 361 * @param imeToken token to track the active input method. Corresponding IME windows can be 362 * identified by checking {@link android.view.WindowManager.LayoutParams#token}. 363 * Note that there is no guarantee that the corresponding window is already 364 * created 365 * @param imeWindowVisible whether the active IME thinks that its window should be visible or 366 * hidden, no matter how WindowManagerService will react / has reacted 367 * to corresponding API calls. Note that this state is not guaranteed 368 * to be synchronized with state in WindowManagerService. 369 * @param dismissImeOnBackKeyPressed {@code true} if the software keyboard is shown and the back 370 * key is expected to dismiss the software keyboard. 371 * @param targetWindowToken token to identify the target window that the IME is associated with. 372 * {@code null} when application, system, or the IME itself decided to 373 * change its window visibility before being associated with any target 374 * window. 375 */ 376 public abstract void updateInputMethodWindowStatus(@NonNull IBinder imeToken, 377 boolean imeWindowVisible, boolean dismissImeOnBackKeyPressed, 378 @Nullable IBinder targetWindowToken); 379 380 /** 381 * Returns true when the hardware keyboard is available. 382 */ 383 public abstract boolean isHardKeyboardAvailable(); 384 385 /** 386 * Sets the callback listener for hardware keyboard status changes. 387 * 388 * @param listener The listener to set. 389 */ 390 public abstract void setOnHardKeyboardStatusChangeListener( 391 OnHardKeyboardStatusChangeListener listener); 392 393 /** Returns true if a stack in the windowing mode is currently visible. */ 394 public abstract boolean isStackVisible(int windowingMode); 395 396 /** 397 * @return True if and only if the docked divider is currently in resize mode. 398 */ 399 public abstract boolean isDockedDividerResizing(); 400 401 /** 402 * Requests the window manager to recompute the windows for accessibility. 403 */ 404 public abstract void computeWindowsForAccessibility(); 405 406 /** 407 * Called after virtual display Id is updated by 408 * {@link com.android.server.vr.Vr2dDisplay} with a specific 409 * {@param vr2dDisplayId}. 410 */ 411 public abstract void setVr2dDisplayId(int vr2dDisplayId); 412 413 /** 414 * Sets callback to DragDropController. 415 */ 416 public abstract void registerDragDropControllerCallback(IDragDropCallback callback); 417 418 /** 419 * @see android.view.IWindowManager#lockNow 420 */ 421 public abstract void lockNow(); 422 423 /** 424 * Return the user that owns the given window, {@link android.os.UserHandle#USER_NULL} if 425 * the window token is not found. 426 */ 427 public abstract int getWindowOwnerUserId(IBinder windowToken); 428 } 429