• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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.WindowCallbacks.RESIZE_MODE_INVALID;
20 
21 import android.annotation.Nullable;
22 import android.content.res.Configuration;
23 import android.graphics.PixelFormat;
24 import android.graphics.Rect;
25 import android.graphics.Region;
26 import android.os.Binder;
27 import android.os.Bundle;
28 import android.os.IBinder;
29 import android.os.RemoteCallback;
30 import android.os.RemoteException;
31 import android.util.Log;
32 import android.util.MergedConfiguration;
33 import android.window.ClientWindowFrames;
34 import android.window.OnBackInvokedCallbackInfo;
35 
36 import java.util.HashMap;
37 import java.util.List;
38 import java.util.Objects;
39 
40 /**
41 * A simplistic implementation of IWindowSession. Rather than managing Surfaces
42 * as children of the display, it manages Surfaces as children of a given root.
43 *
44 * By parcelling the root surface, the app can offer another app content for embedding.
45 * @hide
46 */
47 public class WindowlessWindowManager implements IWindowSession {
48     private final static String TAG = "WindowlessWindowManager";
49 
50     private class State {
51         SurfaceControl mSurfaceControl;
52         WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
53         int mDisplayId;
54         IBinder mInputChannelToken;
55         Region mInputRegion;
56         IWindow mClient;
State(SurfaceControl sc, WindowManager.LayoutParams p, int displayId, IBinder inputChannelToken, IWindow client)57         State(SurfaceControl sc, WindowManager.LayoutParams p, int displayId,
58               IBinder inputChannelToken, IWindow client) {
59             mSurfaceControl = sc;
60             mParams.copyFrom(p);
61             mDisplayId = displayId;
62             mInputChannelToken = inputChannelToken;
63             mClient = client;
64         }
65     };
66 
67     /**
68      * Used to store SurfaceControl we've built for clients to
69      * reconfigure them if relayout is called.
70      */
71     final HashMap<IBinder, State> mStateForWindow = new HashMap<IBinder, State>();
72 
73     public interface ResizeCompleteCallback {
finished(SurfaceControl.Transaction completion)74         public void finished(SurfaceControl.Transaction completion);
75     }
76 
77     final HashMap<IBinder, ResizeCompleteCallback> mResizeCompletionForWindow =
78         new HashMap<IBinder, ResizeCompleteCallback>();
79 
80     private final SurfaceSession mSurfaceSession = new SurfaceSession();
81     protected final SurfaceControl mRootSurface;
82     private final Configuration mConfiguration;
83     private final IWindowSession mRealWm;
84     private final IBinder mHostInputToken;
85     private final IBinder mFocusGrantToken = new Binder();
86     private InsetsState mInsetsState;
87     private final ClientWindowFrames mTmpFrames = new ClientWindowFrames();
88     private final MergedConfiguration mTmpConfig = new MergedConfiguration();
89 
WindowlessWindowManager(Configuration c, SurfaceControl rootSurface, IBinder hostInputToken)90     public WindowlessWindowManager(Configuration c, SurfaceControl rootSurface,
91             IBinder hostInputToken) {
92         mRootSurface = rootSurface;
93         mConfiguration = new Configuration(c);
94         mRealWm = WindowManagerGlobal.getWindowSession();
95         mHostInputToken = hostInputToken;
96     }
97 
setConfiguration(Configuration configuration)98     public void setConfiguration(Configuration configuration) {
99         mConfiguration.setTo(configuration);
100     }
101 
getFocusGrantToken()102     IBinder getFocusGrantToken() {
103         return mFocusGrantToken;
104     }
105 
106     /**
107      * Utility API.
108      */
setCompletionCallback(IBinder window, ResizeCompleteCallback callback)109     void setCompletionCallback(IBinder window, ResizeCompleteCallback callback) {
110         if (mResizeCompletionForWindow.get(window) != null) {
111             Log.w(TAG, "Unsupported overlapping resizes");
112         }
113         mResizeCompletionForWindow.put(window, callback);
114     }
115 
setTouchRegion(IBinder window, @Nullable Region region)116     protected void setTouchRegion(IBinder window, @Nullable Region region) {
117         State state;
118         synchronized (this) {
119             // Do everything while locked so that we synchronize with relayout. This should be a
120             // very infrequent operation.
121             state = mStateForWindow.get(window);
122             if (state == null) {
123                 return;
124             }
125             if (Objects.equals(region, state.mInputRegion)) {
126                 return;
127             }
128             state.mInputRegion = region != null ? new Region(region) : null;
129             if (state.mInputChannelToken != null) {
130                 try {
131                     mRealWm.updateInputChannel(state.mInputChannelToken, state.mDisplayId,
132                             state.mSurfaceControl, state.mParams.flags, state.mParams.privateFlags,
133                             state.mInputRegion);
134                 } catch (RemoteException e) {
135                     Log.e(TAG, "Failed to update surface input channel: ", e);
136                 }
137             }
138         }
139     }
140 
attachToParentSurface(IWindow window, SurfaceControl.Builder b)141     protected void attachToParentSurface(IWindow window, SurfaceControl.Builder b) {
142         b.setParent(mRootSurface);
143     }
144 
145     /**
146      * IWindowSession implementation.
147      */
148     @Override
addToDisplay(IWindow window, WindowManager.LayoutParams attrs, int viewVisibility, int displayId, InsetsVisibilities requestedVisibilities, InputChannel outInputChannel, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls, Rect outAttachedFrame, float[] outSizeCompatScale)149     public int addToDisplay(IWindow window, WindowManager.LayoutParams attrs,
150             int viewVisibility, int displayId, InsetsVisibilities requestedVisibilities,
151             InputChannel outInputChannel, InsetsState outInsetsState,
152             InsetsSourceControl[] outActiveControls, Rect outAttachedFrame,
153             float[] outSizeCompatScale) {
154         final SurfaceControl.Builder b = new SurfaceControl.Builder(mSurfaceSession)
155                 .setFormat(attrs.format)
156                 .setBLASTLayer()
157                 .setName(attrs.getTitle().toString())
158                 .setCallsite("WindowlessWindowManager.addToDisplay");
159         attachToParentSurface(window, b);
160         final SurfaceControl sc = b.build();
161 
162         if (((attrs.inputFeatures &
163                 WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL) == 0)) {
164             try {
165                 if (mRealWm instanceof IWindowSession.Stub) {
166                     mRealWm.grantInputChannel(displayId,
167                             new SurfaceControl(sc, "WindowlessWindowManager.addToDisplay"),
168                             window, mHostInputToken, attrs.flags, attrs.privateFlags, attrs.type,
169                             mFocusGrantToken, attrs.getTitle().toString(), outInputChannel);
170                 } else {
171                     mRealWm.grantInputChannel(displayId, sc, window, mHostInputToken, attrs.flags,
172                             attrs.privateFlags, attrs.type, mFocusGrantToken,
173                             attrs.getTitle().toString(), outInputChannel);
174                 }
175             } catch (RemoteException e) {
176                 Log.e(TAG, "Failed to grant input to surface: ", e);
177             }
178         }
179 
180         final State state = new State(sc, attrs, displayId,
181             outInputChannel != null ? outInputChannel.getToken() : null, window);
182         synchronized (this) {
183             mStateForWindow.put(window.asBinder(), state);
184         }
185         outAttachedFrame.set(0, 0, -1, -1);
186         outSizeCompatScale[0] = 1f;
187 
188         final int res = WindowManagerGlobal.ADD_OKAY | WindowManagerGlobal.ADD_FLAG_APP_VISIBLE |
189                         WindowManagerGlobal.ADD_FLAG_USE_BLAST;
190 
191         // Include whether the window is in touch mode.
192         return isInTouchMode() ? res | WindowManagerGlobal.ADD_FLAG_IN_TOUCH_MODE : res;
193     }
194 
195     /**
196      * IWindowSession implementation. Currently this class doesn't need to support for multi-user.
197      */
198     @Override
addToDisplayAsUser(IWindow window, WindowManager.LayoutParams attrs, int viewVisibility, int displayId, int userId, InsetsVisibilities requestedVisibilities, InputChannel outInputChannel, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls, Rect outAttachedFrame, float[] outSizeCompatScale)199     public int addToDisplayAsUser(IWindow window, WindowManager.LayoutParams attrs,
200             int viewVisibility, int displayId, int userId, InsetsVisibilities requestedVisibilities,
201             InputChannel outInputChannel, InsetsState outInsetsState,
202             InsetsSourceControl[] outActiveControls, Rect outAttachedFrame,
203             float[] outSizeCompatScale) {
204         return addToDisplay(window, attrs, viewVisibility, displayId, requestedVisibilities,
205                 outInputChannel, outInsetsState, outActiveControls, outAttachedFrame,
206                 outSizeCompatScale);
207     }
208 
209     @Override
addToDisplayWithoutInputChannel(android.view.IWindow window, android.view.WindowManager.LayoutParams attrs, int viewVisibility, int layerStackId, android.view.InsetsState insetsState, Rect outAttachedFrame, float[] outSizeCompatScale)210     public int addToDisplayWithoutInputChannel(android.view.IWindow window,
211             android.view.WindowManager.LayoutParams attrs, int viewVisibility, int layerStackId,
212             android.view.InsetsState insetsState, Rect outAttachedFrame,
213             float[] outSizeCompatScale) {
214         return 0;
215     }
216 
217     @Override
remove(android.view.IWindow window)218     public void remove(android.view.IWindow window) throws RemoteException {
219         mRealWm.remove(window);
220         State state;
221         synchronized (this) {
222             state = mStateForWindow.remove(window.asBinder());
223         }
224         if (state == null) {
225             throw new IllegalArgumentException(
226                     "Invalid window token (never added or removed already)");
227         }
228         removeSurface(state.mSurfaceControl);
229     }
230 
231     /** Separate from {@link #remove} so that subclasses can put removal on a sync transaction. */
removeSurface(SurfaceControl sc)232     protected void removeSurface(SurfaceControl sc) {
233         try (SurfaceControl.Transaction t = new SurfaceControl.Transaction()) {
234             t.remove(sc).apply();
235         }
236     }
237 
isOpaque(WindowManager.LayoutParams attrs)238     private boolean isOpaque(WindowManager.LayoutParams attrs) {
239         if (attrs.surfaceInsets != null && attrs.surfaceInsets.left != 0 ||
240                 attrs.surfaceInsets.top != 0 || attrs.surfaceInsets.right != 0 ||
241                 attrs.surfaceInsets.bottom != 0) {
242             return false;
243         }
244         return !PixelFormat.formatHasAlpha(attrs.format);
245     }
246 
isInTouchMode()247     private boolean isInTouchMode() {
248         try {
249             return WindowManagerGlobal.getWindowSession().getInTouchMode();
250         } catch (RemoteException e) {
251             Log.e(TAG, "Unable to check if the window is in touch mode", e);
252         }
253         return false;
254     }
255 
256     /** Access to package members for SystemWindow leashing
257      * @hide
258      */
getWindowBinder(View rootView)259     protected IBinder getWindowBinder(View rootView) {
260         final ViewRootImpl root = rootView.getViewRootImpl();
261         if (root == null) {
262             return null;
263         }
264         return root.mWindow.asBinder();
265     }
266 
267     /** @hide */
268     @Nullable
getSurfaceControl(View rootView)269     protected SurfaceControl getSurfaceControl(View rootView) {
270         final ViewRootImpl root = rootView.getViewRootImpl();
271         if (root == null) {
272             return null;
273         }
274         return getSurfaceControl(root.mWindow);
275     }
276 
277     /** @hide */
278     @Nullable
getSurfaceControl(IWindow window)279     protected SurfaceControl getSurfaceControl(IWindow window) {
280         final State s = mStateForWindow.get(window.asBinder());
281         if (s == null) {
282             return null;
283         }
284         return s.mSurfaceControl;
285     }
286 
287     @Override
relayout(IWindow window, WindowManager.LayoutParams inAttrs, int requestedWidth, int requestedHeight, int viewFlags, int flags, int seq, int lastSyncSeqId, ClientWindowFrames outFrames, MergedConfiguration outMergedConfiguration, SurfaceControl outSurfaceControl, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls, Bundle outSyncSeqIdBundle)288     public int relayout(IWindow window, WindowManager.LayoutParams inAttrs,
289             int requestedWidth, int requestedHeight, int viewFlags, int flags, int seq,
290             int lastSyncSeqId, ClientWindowFrames outFrames,
291             MergedConfiguration outMergedConfiguration, SurfaceControl outSurfaceControl,
292             InsetsState outInsetsState, InsetsSourceControl[] outActiveControls,
293             Bundle outSyncSeqIdBundle) {
294         final State state;
295         synchronized (this) {
296             state = mStateForWindow.get(window.asBinder());
297         }
298         if (state == null) {
299             throw new IllegalArgumentException(
300                     "Invalid window token (never added or removed already)");
301         }
302         SurfaceControl sc = state.mSurfaceControl;
303         SurfaceControl.Transaction t = new SurfaceControl.Transaction();
304 
305         int attrChanges = 0;
306         if (inAttrs != null) {
307             attrChanges = state.mParams.copyFrom(inAttrs);
308         }
309         WindowManager.LayoutParams attrs = state.mParams;
310 
311         if (viewFlags == View.VISIBLE) {
312             t.setOpaque(sc, isOpaque(attrs)).show(sc).apply();
313             if (outSurfaceControl != null) {
314                 outSurfaceControl.copyFrom(sc, "WindowlessWindowManager.relayout");
315             }
316         } else {
317             t.hide(sc).apply();
318             if (outSurfaceControl != null) {
319                 outSurfaceControl.release();
320             }
321         }
322         if (outFrames != null) {
323             outFrames.frame.set(0, 0, attrs.width, attrs.height);
324             outFrames.displayFrame.set(outFrames.frame);
325         }
326 
327         if (outMergedConfiguration != null) {
328             outMergedConfiguration.setConfiguration(mConfiguration, mConfiguration);
329         }
330 
331         if ((attrChanges & WindowManager.LayoutParams.FLAGS_CHANGED) != 0
332                 && state.mInputChannelToken != null) {
333             try {
334                 if(mRealWm instanceof IWindowSession.Stub) {
335                     mRealWm.updateInputChannel(state.mInputChannelToken, state.mDisplayId,
336                             new SurfaceControl(sc, "WindowlessWindowManager.relayout"),
337                             attrs.flags, attrs.privateFlags, state.mInputRegion);
338                 } else {
339                     mRealWm.updateInputChannel(state.mInputChannelToken, state.mDisplayId, sc,
340                             attrs.flags, attrs.privateFlags, state.mInputRegion);
341                 }
342             } catch (RemoteException e) {
343                 Log.e(TAG, "Failed to update surface input channel: ", e);
344             }
345         }
346 
347         if (outInsetsState != null && mInsetsState != null) {
348             outInsetsState.set(mInsetsState);
349         }
350 
351         return 0;
352     }
353 
354     @Override
relayoutAsync(IWindow window, WindowManager.LayoutParams inAttrs, int requestedWidth, int requestedHeight, int viewFlags, int flags, int seq, int lastSyncSeqId)355     public void relayoutAsync(IWindow window, WindowManager.LayoutParams inAttrs,
356             int requestedWidth, int requestedHeight, int viewFlags, int flags, int seq,
357             int lastSyncSeqId) {
358         relayout(window, inAttrs, requestedWidth, requestedHeight, viewFlags, flags, seq,
359                 lastSyncSeqId, null /* outFrames */, null /* outMergedConfiguration */,
360                 null /* outSurfaceControl */, null /* outInsetsState */,
361                 null /* outActiveControls */, null /* outSyncSeqIdBundle */);
362     }
363 
364     @Override
prepareToReplaceWindows(android.os.IBinder appToken, boolean childrenOnly)365     public void prepareToReplaceWindows(android.os.IBinder appToken, boolean childrenOnly) {
366     }
367 
368     @Override
outOfMemory(android.view.IWindow window)369     public boolean outOfMemory(android.view.IWindow window) {
370         return false;
371     }
372 
373     @Override
setInsets(android.view.IWindow window, int touchableInsets, android.graphics.Rect contentInsets, android.graphics.Rect visibleInsets, android.graphics.Region touchableRegion)374     public void setInsets(android.view.IWindow window, int touchableInsets,
375             android.graphics.Rect contentInsets, android.graphics.Rect visibleInsets,
376             android.graphics.Region touchableRegion) {
377         setTouchRegion(window.asBinder(), touchableRegion);
378     }
379 
380     @Override
clearTouchableRegion(android.view.IWindow window)381     public void clearTouchableRegion(android.view.IWindow window) {
382         setTouchRegion(window.asBinder(), null);
383     }
384 
385     @Override
finishDrawing(android.view.IWindow window, android.view.SurfaceControl.Transaction postDrawTransaction, int seqId)386     public void finishDrawing(android.view.IWindow window,
387             android.view.SurfaceControl.Transaction postDrawTransaction, int seqId) {
388         synchronized (this) {
389             final ResizeCompleteCallback c =
390                 mResizeCompletionForWindow.get(window.asBinder());
391             if (c == null) {
392                 // No one wanted the callback, but it wasn't necessarily unexpected.
393                 postDrawTransaction.apply();
394                 return;
395             }
396             c.finished(postDrawTransaction);
397             mResizeCompletionForWindow.remove(window.asBinder());
398         }
399     }
400 
401     @Override
setInTouchMode(boolean showFocus)402     public void setInTouchMode(boolean showFocus) {
403     }
404 
405     @Override
getInTouchMode()406     public boolean getInTouchMode() {
407         return false;
408     }
409 
410     @Override
performHapticFeedback(int effectId, boolean always)411     public boolean performHapticFeedback(int effectId, boolean always) {
412         return false;
413     }
414 
415     @Override
performDrag(android.view.IWindow window, int flags, android.view.SurfaceControl surface, int touchSource, float touchX, float touchY, float thumbCenterX, float thumbCenterY, android.content.ClipData data)416     public android.os.IBinder performDrag(android.view.IWindow window, int flags,
417             android.view.SurfaceControl surface, int touchSource, float touchX, float touchY,
418             float thumbCenterX, float thumbCenterY, android.content.ClipData data) {
419         return null;
420     }
421 
422     @Override
reportDropResult(android.view.IWindow window, boolean consumed)423     public void reportDropResult(android.view.IWindow window, boolean consumed) {
424     }
425 
426     @Override
cancelDragAndDrop(android.os.IBinder dragToken, boolean skipAnimation)427     public void cancelDragAndDrop(android.os.IBinder dragToken, boolean skipAnimation) {
428     }
429 
430     @Override
dragRecipientEntered(android.view.IWindow window)431     public void dragRecipientEntered(android.view.IWindow window) {
432     }
433 
434     @Override
dragRecipientExited(android.view.IWindow window)435     public void dragRecipientExited(android.view.IWindow window) {
436     }
437 
438     @Override
setWallpaperPosition(android.os.IBinder windowToken, float x, float y, float xstep, float ystep)439     public void setWallpaperPosition(android.os.IBinder windowToken, float x, float y,
440             float xstep, float ystep) {
441     }
442 
443     @Override
setWallpaperZoomOut(android.os.IBinder windowToken, float zoom)444     public void setWallpaperZoomOut(android.os.IBinder windowToken, float zoom) {
445     }
446 
447     @Override
setShouldZoomOutWallpaper(android.os.IBinder windowToken, boolean shouldZoom)448     public void setShouldZoomOutWallpaper(android.os.IBinder windowToken, boolean shouldZoom) {
449     }
450 
451     @Override
wallpaperOffsetsComplete(android.os.IBinder window)452     public void wallpaperOffsetsComplete(android.os.IBinder window) {
453     }
454 
455     @Override
setWallpaperDisplayOffset(android.os.IBinder windowToken, int x, int y)456     public void setWallpaperDisplayOffset(android.os.IBinder windowToken, int x, int y) {
457     }
458 
459     @Override
sendWallpaperCommand(android.os.IBinder window, java.lang.String action, int x, int y, int z, android.os.Bundle extras, boolean sync)460     public android.os.Bundle sendWallpaperCommand(android.os.IBinder window,
461             java.lang.String action, int x, int y, int z, android.os.Bundle extras, boolean sync) {
462         return null;
463     }
464 
465     @Override
wallpaperCommandComplete(android.os.IBinder window, android.os.Bundle result)466     public void wallpaperCommandComplete(android.os.IBinder window, android.os.Bundle result) {
467     }
468 
469     @Override
onRectangleOnScreenRequested(android.os.IBinder token, android.graphics.Rect rectangle)470     public void onRectangleOnScreenRequested(android.os.IBinder token,
471             android.graphics.Rect rectangle) {
472     }
473 
474     @Override
getWindowId(android.os.IBinder window)475     public android.view.IWindowId getWindowId(android.os.IBinder window) {
476         return null;
477     }
478 
479     @Override
pokeDrawLock(android.os.IBinder window)480     public void pokeDrawLock(android.os.IBinder window) {
481     }
482 
483     @Override
startMovingTask(android.view.IWindow window, float startX, float startY)484     public boolean startMovingTask(android.view.IWindow window, float startX, float startY) {
485         return false;
486     }
487 
488     @Override
finishMovingTask(android.view.IWindow window)489     public void finishMovingTask(android.view.IWindow window) {
490     }
491 
492     @Override
updatePointerIcon(android.view.IWindow window)493     public void updatePointerIcon(android.view.IWindow window) {
494     }
495 
496     @Override
updateTapExcludeRegion(android.view.IWindow window, android.graphics.Region region)497     public void updateTapExcludeRegion(android.view.IWindow window,
498             android.graphics.Region region) {
499     }
500 
501     @Override
updateRequestedVisibilities(IWindow window, InsetsVisibilities visibilities)502     public void updateRequestedVisibilities(IWindow window, InsetsVisibilities visibilities)  {
503     }
504 
505     @Override
reportSystemGestureExclusionChanged(android.view.IWindow window, List<Rect> exclusionRects)506     public void reportSystemGestureExclusionChanged(android.view.IWindow window,
507             List<Rect> exclusionRects) {
508     }
509 
510     @Override
reportKeepClearAreasChanged(android.view.IWindow window, List<Rect> restrictedRects, List<Rect> unrestrictedRects)511     public void reportKeepClearAreasChanged(android.view.IWindow window, List<Rect> restrictedRects,
512             List<Rect> unrestrictedRects) {
513     }
514 
515     @Override
grantInputChannel(int displayId, SurfaceControl surface, IWindow window, IBinder hostInputToken, int flags, int privateFlags, int type, IBinder focusGrantToken, String inputHandleName, InputChannel outInputChannel)516     public void grantInputChannel(int displayId, SurfaceControl surface, IWindow window,
517             IBinder hostInputToken, int flags, int privateFlags, int type, IBinder focusGrantToken,
518             String inputHandleName, InputChannel outInputChannel) {
519     }
520 
521     @Override
updateInputChannel(IBinder channelToken, int displayId, SurfaceControl surface, int flags, int privateFlags, Region region)522     public void updateInputChannel(IBinder channelToken, int displayId, SurfaceControl surface,
523             int flags, int privateFlags, Region region) {
524     }
525 
526     @Override
asBinder()527     public android.os.IBinder asBinder() {
528         return null;
529     }
530 
531     @Override
grantEmbeddedWindowFocus(IWindow callingWindow, IBinder targetInputToken, boolean grantFocus)532     public void grantEmbeddedWindowFocus(IWindow callingWindow, IBinder targetInputToken,
533                                          boolean grantFocus) {
534     }
535 
536     @Override
generateDisplayHash(IWindow window, Rect boundsInWindow, String hashAlgorithm, RemoteCallback callback)537     public void generateDisplayHash(IWindow window, Rect boundsInWindow, String hashAlgorithm,
538             RemoteCallback callback) {
539     }
540 
541     @Override
setOnBackInvokedCallbackInfo(IWindow iWindow, OnBackInvokedCallbackInfo callbackInfo)542     public void setOnBackInvokedCallbackInfo(IWindow iWindow,
543             OnBackInvokedCallbackInfo callbackInfo) throws RemoteException { }
544 
545     @Override
dropForAccessibility(IWindow window, int x, int y)546     public boolean dropForAccessibility(IWindow window, int x, int y) {
547         return false;
548     }
549 
setInsetsState(InsetsState state)550     public void setInsetsState(InsetsState state) {
551         mInsetsState = state;
552         for (State s : mStateForWindow.values()) {
553             try {
554                 mTmpFrames.frame.set(0, 0, s.mParams.width, s.mParams.height);
555                 mTmpFrames.displayFrame.set(mTmpFrames.frame);
556                 mTmpConfig.setConfiguration(mConfiguration, mConfiguration);
557                 s.mClient.resized(mTmpFrames, false /* reportDraw */, mTmpConfig, state,
558                         false /* forceLayout */, false /* alwaysConsumeSystemBars */, s.mDisplayId,
559                         Integer.MAX_VALUE, RESIZE_MODE_INVALID);
560             } catch (RemoteException e) {
561                 // Too bad
562             }
563         }
564     }
565 
566     @Override
cancelDraw(IWindow window)567     public boolean cancelDraw(IWindow window) {
568         return false;
569     }
570 }
571