Android 13 NavigationBar流程
一、概述
Android SystemUI之NavigationBar
packages/apps/Settings/src/com/android/settings/gestures/SystemNavigationGestureSettings.java
frameworks/base/core/java/android/content/om/OverlayManager.java
frameworks/base/services/core/java/com/android/server/om/OverlayManagerService.java
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
frameworks/base/services/core/java/com/android/server/am/ProcessList.java
frameworks/base/core/java/android/app/ActivityThread.java
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationModeController.java
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarInflaterView.java
frameworks/base/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java
packages/apps/Launcher3/src/com/android/launcher3/util/DisplayController.java
packages/apps/Launcher3/quickstep/src/com/android/quickstep/TouchInteractionService.java
#SystemNavigationGestureSettings.java
|-setCurrentSystemNavigationMode(IOverlayManager overlayManager, String key)
|_overlayManager.setEnabledExclusiveInCategory(overlayPackage, USER_CURRENT)
#OverlayManager.java
|-setEnabledExclusiveInCategory(@NonNull final String packageName, @NonNull UserHandle user)
|_mService.setEnabledExclusiveInCategory(packageName, user.getIdentifier())
#OverlayManagerService.java
|-setEnabledExclusiveInCategory(@Nullable String packageName,final int userIdArg)
|_mImpl.setEnabledExclusive(overlay, true /* withinCategory */, realUserId).ifPresent(OverlayManagerService.this::updateTargetPackagesLocked);
|_updateTargetPackagesLocked(@Nullable Set<PackageAndUser> updatedTargets)
|_updateActivityManager(affectedPackages, userId);
| |_am.scheduleApplicationInfoChanged(targetPackageNames, userId);
| #ActivityManagerService.java
| |-scheduleApplicationInfoChanged(List<String> packageNames, int userId)
| |_updateApplicationInfoLOSP(@NonNull List<String> packagesToUpdate,boolean updateFrameworkRes, int userId)
| |_mProcessList.updateApplicationInfoLOSP(packagesToUpdate, userId, updateFrameworkRes);
| | #ProcessList.java
| | |-updateApplicationInfoLOSP(List<String> packagesToUpdate, int userId,boolean updateFrameworkRes)
| | |_app.getThread().scheduleApplicationInfoChanged(ai);
| | | #ActivityThread.java
| | | |-scheduleApplicationInfoChanged(ApplicationInfo ai)
| | | |_sendMessage(H.APPLICATION_INFO_CHANGED, ai);
| | | |_handleApplicationInfoChanged(@NonNull final ApplicationInfo ai)
| | |_mService.mActivityTaskManager.updateAssetConfiguration(targetProcesses, updateFrameworkRes);
| | #ActivityTaskManagerService.java
| | |-updateAssetConfiguration(List<WindowProcessController> processes,boolean updateFrameworkRes)
| | |_updateConfiguration(newConfig);
| | | |_updateConfigurationLocked(Configuration values, ActivityRecord starting,boolean initLocale, boolean persistent, int userId, boolean deferResume,ActivityTaskManagerService.UpdateConfigurationResult result)
| | | |_updateGlobalConfigurationLocked(@NonNull Configuration values, boolean initLocale,boolean persistent, int userId, boolean deferResume)
| | |_wpc.updateAssetConfiguration(assetSeq);
| |_executor.execute(display::onOverlayChanged);
| |_executor.execute(mWindowManager::onOverlayChanged);
|_broadcastActionOverlayChanged(targets, userId);
|_ ActivityManager.getService().broadcastIntent(null, intent, null, null, 0, null,null, null, android.app.AppOpsManager.OP_NONE, null, false, false, userId);//ACTION_OVERLAY_CHANGED
#NavigationModeController.java
| |-onReceive(Context context, Intent intent)
| |_updateCurrentInteractionMode(true /* notify */);
| |_mListeners.get(i).onNavigationModeChanged(mode);
| #NavigationBar.java
| |-onNavigationModeChanged(int mode)
| | |_updateScreenPinningGestures();
| | |_ setNavBarMode(mode);
| | |_mView.setShouldShowSwipeUpUi(mOverviewProxyService.shouldShowSwipeUpUI());
| #NavigationBarController..java
| |-onNavigationModeChanged(int mode)
| | |_navBar.getView().updateStates();
| | #NavigationBarView.java
| | |-updateStates()
| | |_mNavigationInflaterView.onLikelyDefaultLayoutChange();
| | #NavigationBarInflaterView.java
| | |-onLikelyDefaultLayoutChange()
| | |_getDefaultLayout()
| #EdgeBackGestureHandler.java
| |-onNavigationModeChanged(int mode)
| |_updateIsEnabled();
| |_ mInputMonitor = InputManager.getInstance().monitorGestureInput("edge-swipe", mDisplayId);
| |_mInputEventReceiver = new InputChannelCompat.InputEventReceiver(mInputMonitor.getInputChannel(), Looper.getMainLooper(),Choreographer.getInstance(), this::onInputEvent);
#DisplayController.java
|-onIntent(Intent intent)
| |_handleInfoChange(display);
| |_MAIN_EXECUTOR.execute(() -> notifyChange(displayInfoContext, flags));
#TouchInteractionService.java
|-initInputMonitor("onNavigationModeChanged()");
|_mInputMonitorCompat = new InputMonitorCompat("swipe-up", mDeviceState.getDisplayId());
|_mInputEventReceiver = mInputMonitorCompat.getInputReceiver(Looper.getMainLooper(),mMainChoreographer, this::onInputEvent);
1、Settings切换Navigation Mode
1.1 #setCurrentSystemNavigationMode
<-SystemNavigationGestureSettings.java>
static void setCurrentSystemNavigationMode(IOverlayManager overlayManager, String key) {
String overlayPackage = NAV_BAR_MODE_GESTURAL_OVERLAY;
switch (key) {
case KEY_SYSTEM_NAV_GESTURAL:
overlayPackage = NAV_BAR_MODE_GESTURAL_OVERLAY;
break;
case KEY_SYSTEM_NAV_2BUTTONS:
overlayPackage = NAV_BAR_MODE_2BUTTON_OVERLAY;
break;
case KEY_SYSTEM_NAV_3BUTTONS:
overlayPackage = NAV_BAR_MODE_3BUTTON_OVERLAY;
break;
}
try {
overlayManager.setEnabledExclusiveInCategory(overlayPackage, USER_CURRENT);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
2、framework-overlay
2.1 #setEnabledExclusiveInCategory
<-OverlayManager.java>
/*packageName:
*/product/overlay/NavigationBarModeGestural/NavigationBarModeGesturalOverlay.apk
*/product/overlay/NavigationBarMode3Button/NavigationBarMode3ButtonOverlay.apk
*/
public void setEnabledExclusiveInCategory(@NonNull final String packageName,
@NonNull UserHandle user) throws SecurityE