title: Android Navigation Bar on side by editing AOSP
body: <p>I want to put the Navigation Bar (has system soft keys like back, home and menu. not Navigation Drawer!) on the (right) side, like below, by editing AOSP.</p>
  
  <pre><code>+-------------------------------------------------+---+
  | Status bar (always)                             |   |
  +-------------------------------------------------+ N |
  | (Layout with background drawable)               | a |
  | +---------------------------------------------+ | v |
  | | Title/Action bar (optional)                 | |   |
  | +---------------------------------------------+ | B |
  | | Content, vertical extending                 | | a |
  | |                                             | | r |
  | +---------------------------------------------+ |   |
  +-------------------------------------------------+---+
  </code></pre>
  
  <p>So far I assume <strong><a href="https://android.googlesource.com/platform/frameworks/base/+/android-4.2.2_r1/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java" rel="noreferrer">RenderSessionImpl.java</a></strong> is the file to edit to accomplish this since it renders the screen layout depends on the given screen orientation value.</p>
  
  <p>I found the next snippet and edited the orientation parameter(HORIZONTAL -> VERTICAL) so it would creates a horizontal layout, with the nav bar on the right.  </p>
  
  <pre><code>if (mNavigationBarOrientation == LinearLayout.HORIZONTAL &amp;&amp;
          mNavigationBarSize &gt; 0) {
      // system bar
      try {
          NavigationBar navigationBar = new NavigationBar(context,
                  hardwareConfig.getDensity(), LinearLayout.VERTICAL); // was LinearLayout.HORIZONTAL originallly
          navigationBar.setLayoutParams(
                  new LinearLayout.LayoutParams(
                          LayoutParams.MATCH_PARENT, mNavigationBarSize));
          topLayout.addView(navigationBar);
      } catch (XmlPullParserException e) {
  
      }
  }
  </code></pre>
  
  <p>Original AOSP code snippets are below.</p>
  
  <pre><code>/**
   * Inflates the layout.
   * &lt;p&gt;
   * {@link #acquire(long)} must have been called before this.
   *
   * @throws IllegalStateException if the current context is different than the one owned by
   *      the scene, or if {@link #init(long)} was not called.
   */
  public Result inflate() {
      checkLock();
  
      try {
  
          SessionParams params = getParams();
          HardwareConfig hardwareConfig = params.getHardwareConfig();
          BridgeContext context = getContext();
  
  
          // the view group that receives the window background.
          ViewGroup backgroundView = null;
  
          if (mWindowIsFloating || params.isForceNoDecor()) {
              backgroundView = mViewRoot = mContentRoot = new FrameLayout(context);
          } else {
              if (hasSoftwareButtons() &amp;&amp; mNavigationBarOrientation == LinearLayout.VERTICAL) {
                  /*
                   * This is a special case where the navigation bar is on the right.
                     +-------------------------------------------------+---+
                     | Status bar (always)                             |   |
                     +-------------------------------------------------+   |
                     | (Layout with background drawable)               |   |
                     | +---------------------------------------------+ |   |
                     | | Title/Action bar (optional)                 | |   |
                     | +---------------------------------------------+ |   |
                     | | Content, vertical extending                 | |   |
                     | |                                             | |   |
                     | +---------------------------------------------+ |   |
                     +-------------------------------------------------+---+
  
                     So we create a horizontal layout, with the nav bar on the right,
                     and the left part is the normal layout below without the nav bar at
                     the bottom
                   */
                  LinearLayout topLayout = new LinearLayout(context);
                  mViewRoot = topLayout;
                  topLayout.setOrientation(LinearLayout.HORIZONTAL);
  
                  try {
                      NavigationBar navigationBar = new NavigationBar(context,
                              hardwareConfig.getDensity(), LinearLayout.VERTICAL);
                      navigationBar.setLayoutParams(
                              new LinearLayout.LayoutParams(
                                      mNavigationBarSize,
                                      LayoutParams.MATCH_PARENT));
                      topLayout.addView(navigationBar);
                  } catch (XmlPullParserException e) {
  
                  }
              }
  
              /*
               * we're creating the following layout
               *
                 +-------------------------------------------------+
                 | Status bar (always)                             |
                 +-------------------------------------------------+
                 | (Layout with background drawable)               |
                 | +---------------------------------------------+ |
                 | | Title/Action bar (optional)                 | |
                 | +---------------------------------------------+ |
                 | | Content, vertical extending                 | |
                 | |                                             | |
                 | +---------------------------------------------+ |
                 +-------------------------------------------------+
                 | Navigation bar for soft buttons, maybe see above|
                 +-------------------------------------------------+
  
               */
  
              LinearLayout topLayout = new LinearLayout(context);
              topLayout.setOrientation(LinearLayout.VERTICAL);
              // if we don't already have a view root this is it
              if (mViewRoot == null) {
                  mViewRoot = topLayout;
              } else {
                  LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                          LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
                  layoutParams.weight = 1;
                  topLayout.setLayoutParams(layoutParams);
  
                  // this is the case of soft buttons + vertical bar.
                  // this top layout is the first layout in the horizontal layout. see above)
                  mViewRoot.addView(topLayout, 0);
              }
  
              if (mStatusBarSize &gt; 0) {
                  // system bar
                  try {
                      StatusBar systemBar = new StatusBar(context, hardwareConfig.getDensity());
                      systemBar.setLayoutParams(
                              new LinearLayout.LayoutParams(
                                      LayoutParams.MATCH_PARENT, mStatusBarSize));
                      topLayout.addView(systemBar);
                  } catch (XmlPullParserException e) {
  
                  }
              }
  
              LinearLayout backgroundLayout = new LinearLayout(context);
              backgroundView = backgroundLayout;
              backgroundLayout.setOrientation(LinearLayout.VERTICAL);
              LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                      LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
              layoutParams.weight = 1;
              backgroundLayout.setLayoutParams(layoutParams);
              topLayout.addView(backgroundLayout);
  
  
              // if the theme says no title/action bar, then the size will be 0
              if (mActionBarSize &gt; 0) {
                  try {
                      FakeActionBar actionBar = new FakeActionBar(context,
                              hardwareConfig.getDensity(),
                              params.getAppLabel(), params.getAppIcon());
                      actionBar.setLayoutParams(
                              new LinearLayout.LayoutParams(
                                      LayoutParams.MATCH_PARENT, mActionBarSize));
                      backgroundLayout.addView(actionBar);
                  } catch (XmlPullParserException e) {
  
                  }
              } else if (mTitleBarSize &gt; 0) {
                  try {
                      TitleBar titleBar = new TitleBar(context,
                              hardwareConfig.getDensity(), params.getAppLabel());
                      titleBar.setLayoutParams(
                              new LinearLayout.LayoutParams(
                                      LayoutParams.MATCH_PARENT, mTitleBarSize));
                      backgroundLayout.addView(titleBar);
                  } catch (XmlPullParserException e) {
  
                  }
              }
  
              // content frame
              mContentRoot = new FrameLayout(context);
              layoutParams = new LinearLayout.LayoutParams(
                      LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
              layoutParams.weight = 1;
              mContentRoot.setLayoutParams(layoutParams);
              backgroundLayout.addView(mContentRoot);
  
  if (mNavigationBarOrientation == LinearLayout.HORIZONTAL &amp;&amp;
          mNavigationBarSize &gt; 0) {
      // system bar
      try {
          NavigationBar navigationBar = new NavigationBar(context,
                  hardwareConfig.getDensity(), LinearLayout.HORIZONTAL);
          navigationBar.setLayoutParams(
                  new LinearLayout.LayoutParams(
                          LayoutParams.MATCH_PARENT, mNavigationBarSize));
          topLayout.addView(navigationBar);
      } catch (XmlPullParserException e) {
  
      }
  }
          }
  
  
          // Sets the project callback (custom view loader) to the fragment delegate so that
          // it can instantiate the custom Fragment.
          Fragment_Delegate.setProjectCallback(params.getProjectCallback());
  
          View view = mInflater.inflate(mBlockParser, mContentRoot);
  
          // done with the parser, pop it.
          context.popParser();
  
          Fragment_Delegate.setProjectCallback(null);
  
          // set the AttachInfo on the root view.
          AttachInfo_Accessor.setAttachInfo(mViewRoot);
  
          // post-inflate process. For now this supports TabHost/TabWidget
          postInflateProcess(view, params.getProjectCallback());
  
          // get the background drawable
          if (mWindowBackground != null &amp;&amp; backgroundView != null) {
              Drawable d = ResourceHelper.getDrawable(mWindowBackground, context);
              backgroundView.setBackground(d);
          }
  
          return SUCCESS.createResult();
      } catch (PostInflateException e) {
          return ERROR_INFLATION.createResult(e.getMessage(), e);
      } catch (Throwable e) {
          // get the real cause of the exception.
          Throwable t = e;
          while (t.getCause() != null) {
              t = t.getCause();
          }
  
          return ERROR_INFLATION.createResult(t.getMessage(), t);
      }
  }
  </code></pre>
  
  <p>But the screen layout shows no difference. Any insight for this? Wrong file to edit or wrong logic?
  I know this kind of tweak is not recommended but I really need to do it.</p>