1bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/* 2bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Copyright (C) 2012 The Android Open Source Project 3bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 4bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Licensed under the Apache License, Version 2.0 (the "License"); 5bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * you may not use this file except in compliance with the License. 6bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * You may obtain a copy of the License at 7bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 8bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * http://www.apache.org/licenses/LICENSE-2.0 9bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * 10bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * Unless required by applicable law or agreed to in writing, software 11bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * distributed under the License is distributed on an "AS IS" BASIS, 12bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * See the License for the specific language governing permissions and 14bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell * limitations under the License. 15bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 16bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.appcompat.view; 18bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 19ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP; 208e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas 21bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.Context; 22ee55bf441b2728d359675d9899c6b5efa7bf6a60Aurimas Liutikasimport android.content.res.Configuration; 23bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.Resources; 24bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellimport android.content.res.TypedArray; 2589208232f3b5d1451408d787872504a190bc7ee0Chris Banesimport android.os.Build; 263de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikasimport android.view.ViewConfiguration; 273de8a4e8305507475d7890205184946a25cf45e7Aurimas Liutikas 28ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.annotation.RestrictTo; 29ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikasimport androidx.appcompat.R; 30bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 31bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell/** 3220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * Allows components to query for various configuration policy decisions about how the action bar 3320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns * should lay out and behave on the current device. 3489208232f3b5d1451408d787872504a190bc7ee0Chris Banes * 3589208232f3b5d1451408d787872504a190bc7ee0Chris Banes * @hide 36bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell */ 378e10080c914d1ad0784394fa3026b85535535847Aurimas Liutikas@RestrictTo(LIBRARY_GROUP) 38bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powellpublic class ActionBarPolicy { 39bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private Context mContext; 41bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public static ActionBarPolicy get(Context context) { 4320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return new ActionBarPolicy(context); 4420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 45bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 4620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns private ActionBarPolicy(Context context) { 4720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns mContext = context; 4820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 49bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 50e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski /** 51e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski * Returns the maximum number of action buttons that should be permitted within an action 52e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski * bar/action mode. This will be used to determine how many showAsAction="ifRoom" items can fit. 53e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski * "always" items can override this. 54e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski */ 5520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int getMaxActionButtons() { 56ee55bf441b2728d359675d9899c6b5efa7bf6a60Aurimas Liutikas final Configuration configuration = mContext.getResources().getConfiguration(); 57ee55bf441b2728d359675d9899c6b5efa7bf6a60Aurimas Liutikas final int widthDp = configuration.screenWidthDp; 58ee55bf441b2728d359675d9899c6b5efa7bf6a60Aurimas Liutikas final int heightDp = configuration.screenHeightDp; 59ee55bf441b2728d359675d9899c6b5efa7bf6a60Aurimas Liutikas final int smallest = configuration.smallestScreenWidthDp; 60ed1096ebffac8f3cac5e5b98f54b96ae2ce8579eChris Banes 61ed1096ebffac8f3cac5e5b98f54b96ae2ce8579eChris Banes if (smallest > 600 || widthDp > 600 || (widthDp > 960 && heightDp > 720) 62ed1096ebffac8f3cac5e5b98f54b96ae2ce8579eChris Banes || (widthDp > 720 && heightDp > 960)) { 63e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski // For values-w600dp, values-sw600dp and values-xlarge. 64e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski return 5; 65ed1096ebffac8f3cac5e5b98f54b96ae2ce8579eChris Banes } else if (widthDp >= 500 || (widthDp > 640 && heightDp > 480) 66ed1096ebffac8f3cac5e5b98f54b96ae2ce8579eChris Banes || (widthDp > 480 && heightDp > 640)) { 67e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski // For values-w500dp and values-large. 68e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski return 4; 69ed1096ebffac8f3cac5e5b98f54b96ae2ce8579eChris Banes } else if (widthDp >= 360) { 70e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski // For values-w360dp. 71e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski return 3; 72e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski } else { 73e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski return 2; 74e7d32a52cad0215c4c7c8ec47f5c3a631ce33f8dFilip Gruszczynski } 7520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 76bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 7720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean showsOverflowMenuButton() { 786f490f8da1825fdf2311c67911ad854803ab7e5eChris Banes if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 796f490f8da1825fdf2311c67911ad854803ab7e5eChris Banes return true; 806f490f8da1825fdf2311c67911ad854803ab7e5eChris Banes } else { 817656308f9e4b25765d8105ab12c73b723d7f0c02Aurimas Liutikas return !ViewConfiguration.get(mContext).hasPermanentMenuKey(); 826f490f8da1825fdf2311c67911ad854803ab7e5eChris Banes } 8320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 84bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 8520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int getEmbeddedMenuWidthLimit() { 8620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mContext.getResources().getDisplayMetrics().widthPixels / 2; 8720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 88bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 8920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean hasEmbeddedTabs() { 90ed1096ebffac8f3cac5e5b98f54b96ae2ce8579eChris Banes return mContext.getResources().getBoolean(R.bool.abc_action_bar_embed_tabs); 91bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell } 92bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 9320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int getTabContainerHeight() { 9420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns TypedArray a = mContext.obtainStyledAttributes(null, R.styleable.ActionBar, 9520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns R.attr.actionBarStyle, 0); 9620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns int height = a.getLayoutDimension(R.styleable.ActionBar_height, 0); 9720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns Resources r = mContext.getResources(); 9820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns if (!hasEmbeddedTabs()) { 9920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Stacked tabs; limit the height 10020ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns height = Math.min(height, 10107a07ce59efb770e9fb9ca53a0133e5e64a63bbcChris Banes r.getDimensionPixelSize(R.dimen.abc_action_bar_stacked_max_height)); 10220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 10320ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns a.recycle(); 10420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return height; 10520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 10620ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns 10720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public boolean enableHomeButtonByDefault() { 10820ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Older apps get the home button interaction enabled by default. 10920ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns // Newer apps need to enable it explicitly. 110a2c72b87007d10202c25e78e904938f770c6337dChris Banes return mContext.getApplicationInfo().targetSdkVersion < 111a2c72b87007d10202c25e78e904938f770c6337dChris Banes Build.VERSION_CODES.ICE_CREAM_SANDWICH; 11220ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 113bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell 11420ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns public int getStackedTabMaxWidth() { 11520ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns return mContext.getResources().getDimensionPixelSize( 11607a07ce59efb770e9fb9ca53a0133e5e64a63bbcChris Banes R.dimen.abc_action_bar_stacked_tab_max_width); 11720ac724a3a836bfd362c911f7dc55a61c02b4d44Trevor Johns } 118bbbb8f39d1b1d1b317c5f9237f20fe6b1d9eb17fAdam Powell} 119