跟踪长按powerkey弹窗后触发 mtk ipo的shutdown流程:
长按powerkey弹出以下窗口,点击Standby进入IPO shutdown流程
Step1:
framework/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
powerLongPress()
case LONG_PRESS_POWER_GLOBAL_ACTIONS
showGlobalActionsInternal
→ mGlobalActions.showDialog
Step2 :
framework/base/services/core/java/com/android/server/policy/GlobalActions.java
public void showDialog(boolean keyguardShowing, boolean deviceProvisioned)
→ mGlobalActionsProvider.showGlobalActions()
Step3:
framework/ base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider()
{
..........................
public void showGlobalActions() {
→ mBar.showGlobalActionsMenu()
}
..........................
}
Step4:
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
public void showGlobalActionsMenu()
→ mHandler.obtainMessage(MSG_SHOW_GLOBAL_ACTIONS).sendToTarget();
public void handleMessage(Message msg) {
case MSG_SHOW_GLOBAL_ACTIONS:
for (int i = 0; i < mCallbacks.size(); i++) {
→ mCallbacks.get(i).handleShowGlobalActionsMenu();
}
}
Step5:
.vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java
public void handleShowGlobalActionsMenu() {
→ mExtension.get().showGlobalActions(this);
}
Step6:
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/globalactions/GlobalActionsImpl.java
public void showGlobalActions(GlobalActionsManager manager)
{
if (mDisabled) return;
if (mGlobalActions == null) {
mGlobalActions = new GlobalActionsDialog(mContext, manager);
}
→ mGlobalActions.showDialog
}
Step7:
.vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
public void showDialog(boolean keyguardShowing, boolean isDeviceProvisioned,
GlobalActionsPanelPlugin panelPlugin)
{
→ handleShow();
}
private void handleShow() {
→ mDialog = createDialog() //根据 createDialog定位standby按钮对应执行的回调函数
}
private ActionsDialog createDialog() {
.......................
for (int i = 0; i < defaultActions.length; i++) {
else if (GLOBAL_ACTION_KEY_RESTART.equals(actionKey)) {
→ mItems.add(new RestartAction()); //standby对应的类:RestartAction
}
}
...................
}
private final class RestartAction extends SinglePressAction implements LongPressAction
{
public void onPress() { //定位 class RestartAction 的 onPress回调函数
→ mWindowManagerFuncs.shutdown();
}
}
Step8:
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java
public void shutdown() {
try {
→ mBarService.shutdown();
} catch (RemoteException e) {
}
}
Step9:
.framework/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
public void shutdown() {
mHandler.post(() ->
ShutdownThread.shutdown(getUiContext(),
PowerManager.SHUTDOWN_USER_REQUESTED, false));
//最终通过ShutdownThread.shutdown触发关机
}