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