@Override
  public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle != null && mDrawerToggle.onOptionsItemSelected(item)) {
      return true;
    }

    final int id = item.getItemId();
    if (id == android.R.id.home) {
      onBackPressed();
      return true;
    } else if (id == R.id.menu_create_dir) {
      CreateDirectoryFragment.show(getFragmentManager());
      return true;
    } else if (id == R.id.menu_search) {
      return false;
    } else if (id == R.id.menu_sort_name) {
      setUserSortOrder(State.SORT_ORDER_DISPLAY_NAME);
      return true;
    } else if (id == R.id.menu_sort_date) {
      setUserSortOrder(State.SORT_ORDER_LAST_MODIFIED);
      return true;
    } else if (id == R.id.menu_sort_size) {
      setUserSortOrder(State.SORT_ORDER_SIZE);
      return true;
    } else if (id == R.id.menu_grid) {
      setUserMode(State.MODE_GRID);
      return true;
    } else if (id == R.id.menu_list) {
      setUserMode(State.MODE_LIST);
      return true;
    } else if (id == R.id.menu_advanced) {
      setDisplayAdvancedDevices(!LocalPreferences.getDisplayAdvancedDevices(this));
      return true;
    } else if (id == R.id.menu_file_size) {
      setDisplayFileSize(!LocalPreferences.getDisplayFileSize(this));
      return true;
    } else {
      return super.onOptionsItemSelected(item);
    }
  }
  /// @}
  private void buildDefaultState() {
    mState = new State();

    final Intent intent = getIntent();
    final String action = intent.getAction();
    if (Intent.ACTION_OPEN_DOCUMENT.equals(action)) {
      mState.action = ACTION_OPEN;
    } else if (Intent.ACTION_CREATE_DOCUMENT.equals(action)) {
      mState.action = ACTION_CREATE;
    } else if (Intent.ACTION_GET_CONTENT.equals(action)) {
      mState.action = ACTION_GET_CONTENT;
    } else if (Intent.ACTION_OPEN_DOCUMENT_TREE.equals(action)) {
      mState.action = ACTION_OPEN_TREE;
    } else if (DocumentsContract.ACTION_MANAGE_ROOT.equals(action)) {
      mState.action = ACTION_MANAGE;
    }

    if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) {
      mState.allowMultiple = intent.getBooleanExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
    }

    if (mState.action == ACTION_MANAGE) {
      mState.acceptMimes = new String[] {"*/*"};
      mState.allowMultiple = true;
    } else if (intent.hasExtra(Intent.EXTRA_MIME_TYPES)) {
      mState.acceptMimes = intent.getStringArrayExtra(Intent.EXTRA_MIME_TYPES);
    } else {
      mState.acceptMimes = new String[] {intent.getType()};
    }

    mState.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false);
    mState.forceAdvanced = intent.getBooleanExtra(DocumentsContract.EXTRA_SHOW_ADVANCED, false);
    mState.showAdvanced = mState.forceAdvanced | LocalPreferences.getDisplayAdvancedDevices(this);

    if (mState.action == ACTION_MANAGE) {
      mState.showSize = true;
    } else {
      mState.showSize = LocalPreferences.getDisplayFileSize(this);
    }
  }
 private void setDisplayFileSize(boolean display) {
   LocalPreferences.setDisplayFileSize(this, display);
   mState.showSize = display;
   DirectoryFragment.get(getFragmentManager()).onDisplayStateChanged();
   invalidateOptionsMenu();
 }
 private void setDisplayAdvancedDevices(boolean display) {
   LocalPreferences.setDisplayAdvancedDevices(this, display);
   mState.showAdvanced = mState.forceAdvanced | display;
   RootsFragment.get(getFragmentManager()).onDisplayStateChanged();
   invalidateOptionsMenu();
 }
  @Override
  public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);

    final FragmentManager fm = getFragmentManager();

    final RootInfo root = getCurrentRoot();
    final DocumentInfo cwd = getCurrentDirectory();

    final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
    final MenuItem search = menu.findItem(R.id.menu_search);
    final MenuItem sort = menu.findItem(R.id.menu_sort);
    final MenuItem sortSize = menu.findItem(R.id.menu_sort_size);
    final MenuItem grid = menu.findItem(R.id.menu_grid);
    final MenuItem list = menu.findItem(R.id.menu_list);
    final MenuItem advanced = menu.findItem(R.id.menu_advanced);
    final MenuItem fileSize = menu.findItem(R.id.menu_file_size);

    sort.setVisible(cwd != null);
    grid.setVisible(mState.derivedMode != MODE_GRID);
    list.setVisible(mState.derivedMode != MODE_LIST);

    if (mState.currentSearch != null) {
      // Search uses backend ranking; no sorting
      sort.setVisible(false);

      search.expandActionView();

      mSearchView.setIconified(false);
      mSearchView.clearFocus();
      mSearchView.setQuery(mState.currentSearch, false);
    } else {
      mIgnoreNextClose = true;
      mSearchView.setIconified(true);
      mSearchView.clearFocus();

      mIgnoreNextCollapse = true;
      search.collapseActionView();
    }

    // Only sort by size when visible
    sortSize.setVisible(mState.showSize);

    final boolean searchVisible;
    if (mState.action == ACTION_CREATE || mState.action == ACTION_OPEN_TREE) {
      createDir.setVisible(cwd != null && cwd.isCreateSupported());
      searchVisible = false;

      // No display options in recent directories
      if (cwd == null) {
        grid.setVisible(false);
        list.setVisible(false);
      }

      if (mState.action == ACTION_CREATE) {
        /// M: add to avoid seldom NullPointerException
        SaveFragment saveFragment = SaveFragment.get(fm);
        if (null != saveFragment) {
          saveFragment.setSaveEnabled(cwd != null && cwd.isCreateSupported());
        } else {
          Log.e(TAG, "onPrepareOptionsMenu, SaveFragment is null");
        }
      }
    } else {
      createDir.setVisible(false);

      searchVisible = root != null && ((root.flags & Root.FLAG_SUPPORTS_SEARCH) != 0);
    }

    // TODO: close any search in-progress when hiding
    search.setVisible(searchVisible);

    advanced.setTitle(
        LocalPreferences.getDisplayAdvancedDevices(this)
            ? R.string.menu_advanced_hide
            : R.string.menu_advanced_show);
    fileSize.setTitle(
        LocalPreferences.getDisplayFileSize(this)
            ? R.string.menu_file_size_hide
            : R.string.menu_file_size_show);

    /// M: If in force show advance mode, need hide advance menu
    advanced.setVisible(mState.action != ACTION_MANAGE && !mState.forceAdvanced);
    /// M: If cmd == null and mState.action == ACTION_CREATE, it means show
    /// RecentsCreateFragment, we need hide file size menu to avoid exception
    fileSize.setVisible(
        mState.action != ACTION_MANAGE && !(cwd == null && mState.action == ACTION_CREATE));

    return true;
  }