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}