18123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes/*
28123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes * Copyright (C) 2013 The Android Open Source Project
38123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes *
48123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
58123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes * you may not use this file except in compliance with the License.
68123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes * You may obtain a copy of the License at
78123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes *
88123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes *      http://www.apache.org/licenses/LICENSE-2.0
98123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes *
108123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes * Unless required by applicable law or agreed to in writing, software
118123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
128123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes * See the License for the specific language governing permissions and
148123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes * limitations under the License.
158123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes */
168123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
178123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banespackage android.support.v7.app;
188123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
198123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banesimport android.support.v7.appcompat.R;
208123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banesimport android.support.v7.internal.widget.NativeActionModeAwareLayout;
218123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banesimport android.view.ActionMode;
228123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banesimport android.view.Menu;
238123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banesimport android.view.MenuItem;
248123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
258123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banesclass ActionBarImplHC extends ActionBarImplBase
268123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        implements NativeActionModeAwareLayout.OnActionModeForChildListener {
278123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
288123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    final NativeActionModeAwareLayout mNativeActionModeAwareLayout;
298123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    private ActionMode mCurActionMode;
308123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
318123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    public ActionBarImplHC(ActionBarActivity activity, Callback callback) {
328123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        super(activity, callback);
338123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
348123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        // NativeActionModeAwareLayout is used to notify us whena native Action Mode is started
358123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        mNativeActionModeAwareLayout = (NativeActionModeAwareLayout) activity
368123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes                .findViewById(R.id.action_bar_root);
378123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
388123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        // Can be null when using FEATURE_ACTION_BAR_OVERLAY
398123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        if (mNativeActionModeAwareLayout != null) {
408123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            mNativeActionModeAwareLayout.setActionModeForChildListener(this);
418123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        }
428123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    }
438123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
448123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    // From NativeActionModeAwareLayout.OnActionModeForChildListener
458123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    @Override
468123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    public ActionMode.Callback onActionModeForChild(ActionMode.Callback callback) {
478123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        return new CallbackWrapper(callback);
488123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    }
498123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
508123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    @Override
518123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    public void show() {
528123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        super.show();
538123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        if (mCurActionMode != null) {
548123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            mCurActionMode.finish();
558123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        }
568123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    }
578123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
588123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    @Override
598123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    public void hide() {
608123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        super.hide();
618123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        if (mCurActionMode != null) {
628123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            mCurActionMode.finish();
638123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        }
648123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    }
658123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
668123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    @Override
678123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    boolean isShowHideAnimationEnabled() {
688123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        // Only allow animation if we're not currently showing an action mode
698123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        return mCurActionMode == null && super.isShowHideAnimationEnabled();
708123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    }
718123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
728123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    private class CallbackWrapper implements ActionMode.Callback {
738123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        private final ActionMode.Callback mWrappedCallback;
748123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
758123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        CallbackWrapper(ActionMode.Callback callback) {
768123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            mWrappedCallback = callback;
778123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        }
788123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
798123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        @Override
808123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
818123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            final boolean wrappedResult = mWrappedCallback.onCreateActionMode(mode, menu);
828123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            if (wrappedResult) {
838123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes                // Keep reference to action mode
848123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes                mCurActionMode = mode;
858123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes                // Make sure that the compat Action Bar is shown
868123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes                showForActionMode();
878123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            }
888123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            return wrappedResult;
898123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        }
908123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
918123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        @Override
928123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
938123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            return mWrappedCallback.onPrepareActionMode(mode, menu);
948123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        }
958123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
968123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        @Override
978123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
988123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            return mWrappedCallback.onActionItemClicked(mode, item);
998123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        }
1008123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
1018123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        @Override
1028123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        public void onDestroyActionMode(ActionMode mode) {
1038123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            mWrappedCallback.onDestroyActionMode(mode);
1048123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes
1058123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            // We previously shown the Action Bar for positioning purposes, now hide it again
1068123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            hideForActionMode();
1078123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            // Remove any reference to the mode
1088123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes            mCurActionMode = null;
1098123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes        }
1108123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes    }
1118123e4b3d19031e34a60c0db202f0b3d100eb9d8Chris Banes}