private void performTraversalInTransactionLocked() {
    // Perform one last traversal for each removed display device.
    final int removedCount = mRemovedDisplayDevices.size();
    for (int i = 0; i < removedCount; i++) {
      DisplayDevice device = mRemovedDisplayDevices.get(i);
      device.performTraversalInTransactionLocked();
    }
    mRemovedDisplayDevices.clear();

    // Clear all viewports before configuring displays so that we can keep
    // track of which ones we have configured.
    clearViewportsLocked();

    // Configure each display device.
    final int count = mDisplayDevices.size();
    for (int i = 0; i < count; i++) {
      DisplayDevice device = mDisplayDevices.get(i);
      configureDisplayInTransactionLocked(device);
      device.performTraversalInTransactionLocked();
    }

    // Tell the input system about these new viewports.
    if (mInputManagerFuncs != null) {
      mHandler.sendEmptyMessage(MSG_UPDATE_VIEWPORT);
    }
  }
  @Override
  public void onStart() {
    mHandler.sendEmptyMessage(MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER);

    publishBinderService(Context.DISPLAY_SERVICE, new BinderService(), true /*allowIsolated*/);
    publishLocalService(DisplayManagerInternal.class, new LocalService());
  }
 // Requests that performTraversalsInTransactionFromWindowManager be called at a
 // later time to apply changes to surfaces and displays.
 private void scheduleTraversalLocked(boolean inTraversal) {
   if (!mPendingTraversal && mWindowManagerFuncs != null) {
     mPendingTraversal = true;
     if (!inTraversal) {
       mHandler.sendEmptyMessage(MSG_REQUEST_TRAVERSAL);
     }
   }
 }
  /** Called when the system is ready to go. */
  public void systemReady(boolean safeMode, boolean onlyCore) {
    synchronized (mSyncRoot) {
      mSafeMode = safeMode;
      mOnlyCore = onlyCore;
    }

    mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS);
  }
  public DisplayManagerService(Context context, Handler mainHandler, Handler uiHandler) {
    mContext = context;
    mHeadless = SystemProperties.get(SYSTEM_HEADLESS).equals("1");

    mHandler = new DisplayManagerHandler(mainHandler.getLooper());
    mUiHandler = uiHandler;
    mDisplayAdapterListener = new DisplayAdapterListener();
    mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false);

    mHandler.sendEmptyMessage(MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER);
  }
 private void sendDisplayEventLocked(int displayId, int event) {
   Message msg = mHandler.obtainMessage(MSG_DELIVER_DISPLAY_EVENT, displayId, event);
   mHandler.sendMessage(msg);
 }