Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82772c88 authored by Ben Lin's avatar Ben Lin Committed by Android (Google) Code Review
Browse files

Merge "Isolate Menu/Action management into dedicated manager classes." into nyc-andromeda-dev

parents 843c74a8 7c35b036
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import com.android.documentsui.SearchViewManager.SearchManagerListener;
import com.android.documentsui.State.ViewMode;
import com.android.documentsui.dirlist.AnimationView;
import com.android.documentsui.dirlist.DirectoryFragment;
import com.android.documentsui.dirlist.FragmentTuner;
import com.android.documentsui.dirlist.Model;
import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DocumentStack;
@@ -95,6 +96,8 @@ public abstract class BaseActivity extends Activity

    public abstract void onDocumentPicked(DocumentInfo doc, Model model);
    public abstract void onDocumentsPicked(List<DocumentInfo> docs);
    public abstract FragmentTuner createFragmentTuner();
    public abstract MenuManager getMenuManager();

    abstract void onTaskFinished(Uri... uris);
    abstract void refreshDirectory(int anim);
+20 −30
Original line number Diff line number Diff line
@@ -43,10 +43,13 @@ import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import com.android.documentsui.MenuManager.DirectoryDetails;
import com.android.documentsui.RecentsProvider.RecentColumns;
import com.android.documentsui.RecentsProvider.ResumeColumns;
import com.android.documentsui.dirlist.AnimationView;
import com.android.documentsui.dirlist.DirectoryFragment;
import com.android.documentsui.dirlist.FragmentTuner;
import com.android.documentsui.dirlist.FragmentTuner.DocumentsTuner;
import com.android.documentsui.dirlist.Model;
import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DurableUtils;
@@ -64,6 +67,8 @@ import java.util.List;
public class DocumentsActivity extends BaseActivity {
    private static final int CODE_FORWARD = 42;
    private static final String TAG = "DocumentsActivity";
    private DocumentsMenuManager mMenuManager;
    private DirectoryDetails mDetails;

    public DocumentsActivity() {
        super(R.layout.documents_activity, TAG);
@@ -72,6 +77,8 @@ public class DocumentsActivity extends BaseActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mMenuManager = new DocumentsMenuManager(mSearchManager, getDisplayState());
        mDetails = new DirectoryDetails(this);

        if (mState.action == ACTION_CREATE) {
            final String mimeType = getIntent().getType();
@@ -214,44 +221,15 @@ public class DocumentsActivity extends BaseActivity {
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        mMenuManager.updateOptionMenu(menu, mDetails);

        final DocumentInfo cwd = getCurrentDirectory();

        boolean picking = mState.action == ACTION_CREATE
                || mState.action == ACTION_OPEN_TREE
                || mState.action == ACTION_PICK_COPY_DESTINATION;

        if (picking) {
            // May already be hidden because the root
            // doesn't support search.
            mSearchManager.showMenu(false);
        }

        final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
        final MenuItem grid = menu.findItem(R.id.menu_grid);
        final MenuItem list = menu.findItem(R.id.menu_list);
        final MenuItem fileSize = menu.findItem(R.id.menu_file_size);


        createDir.setVisible(picking);
        createDir.setEnabled(canCreateDirectory());

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

        fileSize.setVisible(fileSize.isVisible() && !picking);

        if (mState.action == ACTION_CREATE) {
            final FragmentManager fm = getFragmentManager();
            SaveFragment.get(fm).prepareForDirectory(cwd);
        }

        Menus.disableHiddenItems(menu);

        return true;
    }

@@ -424,6 +402,18 @@ public class DocumentsActivity extends BaseActivity {
        return (DocumentsActivity) fragment.getActivity();
    }

    @Override
    public FragmentTuner createFragmentTuner() {
        // Currently DocumentsTuner maintains a state specific to the fragment instance. Because of
        // that, we create a new instance everytime it is needed
        return new DocumentsTuner(this, getDisplayState());
    }

    @Override
    public MenuManager getMenuManager() {
        return mMenuManager;
    }

    /**
     * Loads the last used path (stack) from Recents (history).
     * The path selected is based on the calling package name. So the last
+87 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.documentsui;

import static com.android.documentsui.State.ACTION_CREATE;
import static com.android.documentsui.State.ACTION_GET_CONTENT;
import static com.android.documentsui.State.ACTION_OPEN;
import static com.android.documentsui.State.ACTION_OPEN_TREE;
import static com.android.documentsui.State.ACTION_PICK_COPY_DESTINATION;

import android.view.Menu;
import android.view.MenuItem;

final class DocumentsMenuManager implements MenuManager {

  private final State mState;
  private final SearchViewManager mSearchManager;

  public DocumentsMenuManager(SearchViewManager searchManager, State displayState) {
       mSearchManager = searchManager;
       mState = displayState;
  }

  @Override
  public void updateActionMenu(Menu menu, MenuManager.SelectionDetails selection) {
      MenuItem open = menu.findItem(R.id.menu_open);
      MenuItem share = menu.findItem(R.id.menu_share);
      MenuItem delete = menu.findItem(R.id.menu_delete);
      MenuItem rename = menu.findItem(R.id.menu_rename);
      MenuItem selectAll = menu.findItem(R.id.menu_select_all);

      open.setVisible(mState.action == ACTION_GET_CONTENT
              || mState.action == ACTION_OPEN);
      share.setVisible(false);
      delete.setVisible(false);
      rename.setVisible(false);
      selectAll.setVisible(mState.allowMultiple);

      Menus.disableHiddenItems(menu);
  }

    @Override
    public void updateOptionMenu(Menu menu, DirectoryDetails details) {

        boolean picking = mState.action == ACTION_CREATE
                || mState.action == ACTION_OPEN_TREE
                || mState.action == ACTION_PICK_COPY_DESTINATION;

        if (picking) {
            // May already be hidden because the root
            // doesn't support search.
            mSearchManager.showMenu(false);
        }

        final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
        final MenuItem fileSize = menu.findItem(R.id.menu_file_size);

        createDir.setVisible(picking);
        createDir.setEnabled(details.canCreateDirectory());

        // No display options in recent directories
        if (picking && details.isInRecents()) {
            final MenuItem grid = menu.findItem(R.id.menu_grid);
            final MenuItem list = menu.findItem(R.id.menu_list);
            grid.setVisible(false);
            list.setVisible(false);
        }

        fileSize.setVisible(fileSize.isVisible() && !picking);

        Menus.disableHiddenItems(menu);
    }
}
+23 −17
Original line number Diff line number Diff line
@@ -36,10 +36,13 @@ import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;

import com.android.documentsui.MenuManager.DirectoryDetails;
import com.android.documentsui.OperationDialogFragment.DialogType;
import com.android.documentsui.RecentsProvider.ResumeColumns;
import com.android.documentsui.dirlist.AnimationView;
import com.android.documentsui.dirlist.DirectoryFragment;
import com.android.documentsui.dirlist.FragmentTuner;
import com.android.documentsui.dirlist.FragmentTuner.FilesTuner;
import com.android.documentsui.dirlist.Model;
import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DocumentStack;
@@ -67,6 +70,8 @@ public class FilesActivity extends BaseActivity {
    // We use the time gap to figure out whether to close app or reopen the drawer.
    private long mDrawerLastFiddled;
    private DocumentClipper mClipper;
    private FilesMenuManager mMenuManager;
    private DirectoryDetails mDetails;

    public FilesActivity() {
        super(R.layout.files_activity, TAG);
@@ -77,6 +82,13 @@ public class FilesActivity extends BaseActivity {
        super.onCreate(icicle);

        mClipper = DocumentsApplication.getDocumentClipper(this);
        mMenuManager = new FilesMenuManager(mSearchManager);
        mDetails = new DirectoryDetails(this) {
            @Override
            public boolean hasItemsToPaste() {
                return mClipper.hasItemsToPaste();
            }
        };

        RootsFragment.show(getFragmentManager(), null);

@@ -198,23 +210,7 @@ public class FilesActivity extends BaseActivity {
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        final RootInfo root = getCurrentRoot();

        final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
        final MenuItem pasteFromCb = menu.findItem(R.id.menu_paste_from_clipboard);
        final MenuItem settings = menu.findItem(R.id.menu_settings);
        final MenuItem newWindow = menu.findItem(R.id.menu_new_window);

        createDir.setVisible(true);
        createDir.setEnabled(canCreateDirectory());
        pasteFromCb.setEnabled(mClipper.hasItemsToPaste());
        settings.setVisible(root.hasSettings());
        newWindow.setVisible(Shared.shouldShowFancyFeatures(this));

        Menus.disableHiddenItems(menu, pasteFromCb);
        // It hides icon if searching in progress
        mSearchManager.updateMenu();
        mMenuManager.updateOptionMenu(menu, mDetails);
        return true;
    }

@@ -462,6 +458,16 @@ public class FilesActivity extends BaseActivity {
        finish();
    }

    @Override
    public FragmentTuner createFragmentTuner() {
      return new FilesTuner(this, getDisplayState());
    }

    @Override
    public MenuManager getMenuManager() {
      return mMenuManager;
    }

    /**
     * Builds a stack for the specific Uris. Multi roots are not supported, as it's impossible
     * to know which root to select. Also, the stack doesn't contain intermediate directories.
+87 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.documentsui;

import android.view.Menu;
import android.view.MenuItem;

import com.android.documentsui.R;

final class FilesMenuManager implements MenuManager {

    private final SearchViewManager mSearchManager;

    public FilesMenuManager(SearchViewManager searchManager) {
        mSearchManager = searchManager;
    }

    @Override
    public void updateActionMenu(Menu menu, SelectionDetails selection) {

        menu.findItem(R.id.menu_open).setVisible(false); // "open" is never used in Files.

        // Commands accessible only via keyboard...
        MenuItem copy = menu.findItem(R.id.menu_copy_to_clipboard);
        MenuItem paste = menu.findItem(R.id.menu_paste_from_clipboard);

        // Commands visible in the UI...
        MenuItem rename = menu.findItem(R.id.menu_rename);
        MenuItem moveTo = menu.findItem(R.id.menu_move_to);
        MenuItem copyTo = menu.findItem(R.id.menu_copy_to);
        MenuItem share = menu.findItem(R.id.menu_share);
        MenuItem delete = menu.findItem(R.id.menu_delete);

        // Commands usually on action-bar, so we always manage visibility.
        share.setVisible(!selection.containsDirectories() && !selection.containsPartialFiles());
        delete.setVisible(selection.canDelete());

        // Commands always in overflow, so we don't bother showing/hiding...
        copyTo.setVisible(true);
        moveTo.setVisible(true);
        rename.setVisible(true);

        // copy is not visible, keyboard only
        copy.setEnabled(!selection.containsPartialFiles());

        copyTo.setEnabled(!selection.containsPartialFiles());
        moveTo.setEnabled(!selection.containsPartialFiles() && selection.canDelete());
        rename.setEnabled(!selection.containsPartialFiles() && selection.canRename());

        Menus.disableHiddenItems(menu, copy, paste);
    }

    @Override
    public void updateOptionMenu(Menu menu, DirectoryDetails details) {

        final MenuItem createDir = menu.findItem(R.id.menu_create_dir);
        final MenuItem pasteFromCb = menu.findItem(R.id.menu_paste_from_clipboard);
        final MenuItem settings = menu.findItem(R.id.menu_settings);
        final MenuItem newWindow = menu.findItem(R.id.menu_new_window);

        createDir.setVisible(true);
        createDir.setEnabled(details.canCreateDirectory());
        pasteFromCb.setEnabled(details.hasItemsToPaste());
        settings.setVisible(details.hasRootSettings());
        newWindow.setVisible(details.shouldShowFancyFeatures());

        Menus.disableHiddenItems(menu, pasteFromCb);

        // It hides icon if searching in progress
        mSearchManager.updateMenu();
    }

}
Loading