【framework】RootWindowContainer简介
简介 Framework
2023-09-11 14:20:52 时间
1 前言
RootWindowContainer 是窗口容器的根容器,子容器是 DisplayContent。关于其父类及祖父类的介绍,见→WindowContainer简介、ConfigurationContainer简介。
本文主要介绍 WallpaperController 和 RootWindowContainer。
2 源码
2.1 WallpaperController
源码地址→/frameworks/base/services/core/java/com/android/server/wm/WallpaperController.java
(1)主要属性
private WindowManagerService mService
private final DisplayContent mDisplayContent
private final ArrayList<WallpaperWindowToken> mWallpaperTokens = new ArrayList<>()
private WindowState mWallpaperTarget = null
private WindowState mPrevWallpaperTarget = null
private WindowState mWaitingOnWallpaper
private WindowState mTmpTopWallpaper
WindowState mDeferredHideWallpaper = null
private float mLastWallpaperX = -1
private float mLastWallpaperY = -1
private float mLastWallpaperXStep = -1
private float mLastWallpaperYStep = -1
private int mLastWallpaperDisplayOffsetX = Integer.MIN_VALUE
private int mLastWallpaperDisplayOffsetY = Integer.MIN_VALUE
private long mLastWallpaperTimeoutTime
private final FindWallpaperTargetResult mFindResults = new FindWallpaperTargetResult()
(2)内部类
final private static class FindWallpaperTargetResult {
WindowState topWallpaper = null;
WindowState wallpaperTarget = null;
boolean useTopWallpaperAsTarget = false;
boolean resetTopWallpaper = false
//topWallpaper = win
void setTopWallpaper(WindowState win)
//wallpaperTarget = win
void setWallpaperTarget(WindowState win)
//useTopWallpaperAsTarget = topWallpaperAsTarget
void setUseTopWallpaperAsTarget(boolean topWallpaperAsTarget)
void reset()
}
(3)函数
private final ToBooleanFunction<WindowState> mFindWallpaperTargetFunction = w -> {
//mFindResults.setTopWallpaper(w)
//mFindResults.setWallpaperTarget(w)
}
(4)Wallpaper 相关
//return mWallpaperTarget
WindowState getWallpaperTarget()
//return win == mWallpaperTarget
boolean isWallpaperTarget(WindowState win)
//return mWallpaperTarget != null && mWallpaperTarget.mLayer >= win.mBaseLayer
boolean isBelowWallpaperTarget(WindowState win)
//return isWallpaperVisible(mWallpaperTarget)
boolean isWallpaperVisible()
//mWallpaperTokens.get(i).updateWallpaperVisibility(isWallpaperVisible(mWallpaperTarget))
void updateWallpaperVisibility()
//hideWallpapers(mDeferredHideWallpaper)
void hideDeferredWallpapersIfNeeded()
//mDeferredHideWallpaper = winGoingAway
void hideWallpapers(final WindowState winGoingAway)
boolean updateWallpaperOffset(WindowState wallpaperWin, int dw, int dh, boolean sync)
void setWindowWallpaperPosition(WindowState window, float x, float y, float xStep, float yStep)
void setWindowWallpaperDisplayOffset(WindowState window, int x, int y)
//mWallpaperTokens.get(i).sendWindowWallpaperCommand(action, x, y, z, extras, sync)
Bundle sendWindowWallpaperCommand(WindowState window, String action, int x, int y, int z, Bundle extras, boolean sync)
//mLastWallpaperTimeoutTime = 0
void clearLastWallpaperTimeoutTime()
//mWaitingOnWallpaper = null; mService.mGlobalLock.notifyAll()
void wallpaperCommandComplete(IBinder window)
//mWaitingOnWallpaper = null; mService.mGlobalLock.notifyAll()
void wallpaperOffsetsComplete(IBinder window)
void adjustWallpaperWindows()
void adjustWallpaperWindowsForAppTransitionIfNeeded(ArraySet<AppWindowToken> openingApps, ArraySet<AppWindowToken> changingApps)
//mWallpaperTokens.add(token)
void addWallpaperToken(WallpaperWindowToken token)
//return canScreenshotWallpaper(getTopVisibleWallpaper())
boolean canScreenshotWallpaper()
Bitmap screenshotWallpaperLocked()
(5)动画
//mWallpaperTokens.get(i).startAnimation(a)
void startWallpaperAnimation(Animation a)
boolean isWallpaperTargetAnimating()
//mService.getRecentsAnimationController().startAnimation()
boolean processWallpaperDrawPendingTimeout()
2.2 RootWindowContainer
源码地址→/frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
(1)类定义
//DisplayContent 为子节点
class RootWindowContainer extends WindowContainer<DisplayContent> implements ConfigurationContainerListener
(2)实现接口
public interface ConfigurationContainerListener {
void onRequestedOverrideConfigurationChanged(Configuration overrideConfiguration);
}
(3)主要属性
private RootActivityContainer mRootActivityContainer
private Object mLastWindowFreezeSource = null
private Session mHoldScreen = null
private float mScreenBrightness = -1
private long mUserActivityTimeout = -1
WindowState mHoldScreenWindow = null
WindowState mObscuringWindow = null
final WallpaperController mWallpaperController
//mHandler = new MyHandler(service.mH.getLooper())
private final Handler mHandler
private int mTopFocusedDisplayId = INVALID_DISPLAY
//key为pid
final HashMap<Integer, AppWindowToken> mTopFocusedAppByProcess = new HashMap<>();
//事务
private final SurfaceControl.Transaction mDisplayTransaction = new SurfaceControl.Transaction()
(4)消费者
//关闭系统对话框,w 为 WindowState 类型
private final Consumer<WindowState> mCloseSystemDialogsConsumer = w -> {
if (w.mHasSurface) {
...
w.mClient.closeSystemDialogs(mCloseSystemDialogsReason);
...
}
};
//移除窗口,w 为 WindowState 类型
private static final Consumer<WindowState> sRemoveReplacedWindowsConsumer = w -> {
final AppWindowToken aToken = w.mAppToken;
if (aToken != null) {
aToken.removeReplacedWindowIfNeeded(w);
}
};
Consumer 类如下。
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
(5)Handler
private final class MyHandler extends Handler {
...
public void handleMessage(Message msg) {
switch (msg.what) {
//设置屏幕亮度
case SET_SCREEN_BRIGHTNESS_OVERRIDE:
mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(msg.arg1);
break;
//设置屏幕休眠时间
case SET_USER_ACTIVITY_TIMEOUT:
mService.mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager((Long) msg.obj);
break;
...
}
}
}
(6)Window 相关
//mChildren.get(i).findFocusedWindow()
WindowState computeFocusedWindow()
void getWindowsByName(ArrayList<WindowState> output, String name)
//mChildren.get(i).getAppWindowToken(binder)
AppWindowToken getAppWindowToken(IBinder binder)
(7)Display 相关
//displaysInFocusOrder.put(i, mChildren.get(i).getDisplayId())
void getDisplaysInFocusOrder(SparseIntArray displaysInFocusOrder)
//mChildren.get(i).getDisplayId() == displayId ? mChildren.get(i) : null
DisplayContent getDisplayContent(int displayId)
//new DisplayContent(display, mService, mWallpaperController, controller)
DisplayContent createDisplayContent(final Display display, DisplayWindowController controller)
//mChildren.get(i).getWindowToken(token.token) == token ? mChildren.get(i) : null
DisplayContent getWindowTokenDisplay(WindowToken token)
//getDisplayContent(displayId).onOverrideConfigurationChanged(newConfiguration)
int[] setDisplayOverrideConfigurationIfNeeded(Configuration newConfiguration, int displayId)
(8)Surface 相关
//mChildren.get(i).destroyLeakedSurfaces()
//mWmService.mActivityManager.killPids(pids, "Free memory", secure)
//winAnimator.destroySurface()
//winAnimator.mWin.mAppToken.getController().removeStartingWindow()
//winAnimator.mWin.mClient.dispatchGetNewSurface()
boolean reclaimSomeSurfaceMemory(WindowStateAnimator winAnimator, String operation, boolean secure)
//performSurfacePlacementNoTrace(recoveringMemory
void performSurfacePlacement(boolean recoveringMemory)
//mWmService.updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, false)
//mChildren.get(i).setExitingTokensHasVisible(false)
//applySurfaceChangesTransaction(recoveringMemory)
//mWmService.enableScreenIfNeededLocked()
//mWmService.scheduleAnimationLocked()
void performSurfacePlacementNoTrace(boolean recoveringMemory)
(9)Layout 相关
//mChildren.get(i).isLayoutNeeded()
boolean isLayoutNeeded()
//final int pendingChanges = animator.getPendingLayoutChanges(mChildren.get(i).getDisplayId())
//return pendingChanges != 0
boolean hasPendingLayoutChanges(WindowAnimator animator)
boolean copyAnimToLayoutParams()
(10)输入法
//mChildren.get(i).mInputMethodWindow
WindowState getCurrentInputMethodWindow()
(11)forAllWindows
//forAllWindows: w.mWinAnimator.setSecureLocked(disabled)
void setSecureSurfaceState(int userId, boolean disabled)
//w.setHiddenWhileSuspended(suspended)
void updateHiddenWhileSuspendedState(final ArraySet<String> packages, final boolean suspended)
//forAllWindows: w.updateAppOpsState()
void updateAppOpsState()
//forAllWindows(mCloseSystemDialogsConsumer, false)
void closeSystemDialogs(String reason)
//forAllWindows(sRemoveReplacedWindowsConsumer, true)
void removeReplacedWindows()
(12)forAllDisplays
void forAllDisplays(Consumer<DisplayContent> callback) {
for (int i = mChildren.size() - 1; i >= 0; --i) {
callback.accept(mChildren.get(i));
}
}
(13)forAllDisplayPolicies
void forAllDisplayPolicies(Consumer<DisplayPolicy> callback) {
for (int i = mChildren.size() - 1; i >= 0; --i) {
callback.accept(mChildren.get(i).getDisplayPolicy());
}
}
(14)其他方法
//mChildren.get(i).getStack(windowingMode, activityType)
TaskStack getStack(int windowingMode, int activityType)
//win = getWindow((w) -> w.mSession.mPid == pid && w.isVisibleLw()), return win != null
boolean canShowStrictModeViolation(int pid)
boolean handleNotObscuredLocked(WindowState w, boolean obscured, boolean syswin)
相关文章
- kubernetes 简介
- ZooKeeper-简介
- 地球引擎初级教程——JavaScript 简介(一文读懂如何使用GEE)
- 《C#多线程编程实战(原书第2版)》——第2章 线 程 同 步 2.1 简介
- kafka简介【转】
- HTML5安全:CORS(跨域资源共享)简介
- 《ASP.NET 开发从入门到精通》----1.2 Web技术简介
- 《众妙之门——JavaScript与jQuery技术精粹》——第2章 复查JavaScript 代码的启示2.1 简介
- 《Web前端开发精品课 HTML与CSS进阶教程》——第一部分 HTML进阶第01章 HTML基础知识1.1 HTML和CSS进阶简介
- 《iOS组件与框架——iOS SDK高级特性剖析》——第6章,第6.1节示例应用简介
- RabbitMQ简介
- 《21天精通TypeScript-1》-TS概述与简介
- 安卓模拟器简介
- Python学习---django之admin简介
- Lua 数组和迭代器简介
- Unity 之 DoTween插件简介
- 【framework】ConfigurationContainer简介
- 跟开涛老师学shiro -- shiro简介