Layout.java revision c7c3636c2f460b9024673eb5b047a26ce09a61e0
1b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta/*
2b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * Copyright (C) 2015 The Android Open Source Project
3b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *
4b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * Licensed under the Apache License, Version 2.0 (the "License");
5b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * you may not use this file except in compliance with the License.
6b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * You may obtain a copy of the License at
7b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *
8b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *      http://www.apache.org/licenses/LICENSE-2.0
9b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *
10b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * Unless required by applicable law or agreed to in writing, software
11b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * distributed under the License is distributed on an "AS IS" BASIS,
12b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * See the License for the specific language governing permissions and
14b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * limitations under the License.
15b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta */
16b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
17b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptapackage com.android.layoutlib.bridge.impl;
18b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
19b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.ide.common.rendering.api.HardwareConfig;
20b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.ide.common.rendering.api.RenderResources;
21b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.ide.common.rendering.api.ResourceValue;
22b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.ide.common.rendering.api.SessionParams;
23b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.Bridge;
24b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.android.BridgeContext;
25790e5f6c1cab43fb377d86d3c9189a509b28b217Diego Perezimport com.android.layoutlib.bridge.android.RenderParamsFlags;
26b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.bars.AppCompatActionBar;
27b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.bars.BridgeActionBar;
28b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.bars.Config;
29b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.bars.FrameworkActionBar;
30b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.bars.NavigationBar;
31b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.bars.StatusBar;
32b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.bars.TitleBar;
33b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.resources.Density;
34b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.resources.ResourceType;
35b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.resources.ScreenOrientation;
36b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
37b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.annotation.NonNull;
38b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.graphics.drawable.Drawable;
39b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.util.DisplayMetrics;
40b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.util.TypedValue;
41b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.view.View;
42b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.widget.FrameLayout;
43b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.widget.LinearLayout;
44b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.widget.RelativeLayout;
45b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
46b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
47b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport static android.widget.LinearLayout.VERTICAL;
48671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Guptaimport static com.android.layoutlib.bridge.impl.ResourceHelper.getBooleanThemeValue;
49b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
50b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta/**
51b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * The Layout used to create the system decor.
52b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *
53b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * The layout inflated will contain a content frame where the user's layout can be inflated.
54b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * <pre>
55b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------------------+---+
56b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Status bar                                      | N |
57b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------------------+ a |
58b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Title/Action bar (optional)                     | v |
59b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------------------+   |
60b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Content, vertical extending                     | b |
61b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  |                                                 | a |
62b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  |                                                 | r |
63b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------------------+---+
64b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * </pre>
65b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * or
66b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * <pre>
67b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------+
68b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Status bar                          |
69b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------+
70b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Title/Action bar (optional)         |
71b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------+
72b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Content, vertical extending         |
73b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  |                                     |
74b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  |                                     |
75b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------+
76b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Nav bar                             |
77b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------+
78b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * </pre>
79b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *
80b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta */
81b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaclass Layout extends RelativeLayout {
82b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
83b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Theme attributes used for configuring appearance of the system decor.
84b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_WINDOW_FLOATING = "windowIsFloating";
85b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_WINDOW_BACKGROUND = "windowBackground";
865a8f33f1b09b0311f1bbd1ec6b90db706edb5219Deepanshu Gupta    private static final String ATTR_WINDOW_FULL_SCREEN = "windowFullscreen";
87b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_NAV_BAR_HEIGHT = "navigation_bar_height";
88b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_NAV_BAR_WIDTH = "navigation_bar_width";
89b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_STATUS_BAR_HEIGHT = "status_bar_height";
90b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_WINDOW_ACTION_BAR = "windowActionBar";
91b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_ACTION_BAR_SIZE = "actionBarSize";
92b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_WINDOW_NO_TITLE = "windowNoTitle";
93b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_WINDOW_TITLE_SIZE = "windowTitleSize";
94fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta    private static final String ATTR_WINDOW_TRANSLUCENT_STATUS = StatusBar.ATTR_TRANSLUCENT;
95fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta    private static final String ATTR_WINDOW_TRANSLUCENT_NAV = NavigationBar.ATTR_TRANSLUCENT;
96b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
97b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Default sizes
98b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final int DEFAULT_STATUS_BAR_HEIGHT = 25;
99b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final int DEFAULT_TITLE_BAR_HEIGHT = 25;
100b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final int DEFAULT_NAV_BAR_SIZE = 48;
101b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
102b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Ids assigned to components created. This is so that we can refer to other components in
103b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // layout params.
104b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_NAV_BAR = "navBar";
105b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_STATUS_BAR = "statusBar";
106b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_TITLE_BAR = "titleBar";
107b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Prefix used with the above ids in order to make them unique in framework namespace.
108b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_PREFIX = "android_layoutlib_";
109b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
110b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
111b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * Temporarily store the builder so that it doesn't have to be passed to all methods used
112b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * during inflation.
113b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
114b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private Builder mBuilder;
115b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
116b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
117b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * This holds user's layout.
118b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
119b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private FrameLayout mContentRoot;
120b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
121b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    public Layout(@NonNull Builder builder) {
122b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        super(builder.mContext);
123b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        mBuilder = builder;
124b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (builder.mWindowBackground != null) {
125b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            Drawable d = ResourceHelper.getDrawable(builder.mWindowBackground, builder.mContext);
126b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            setBackground(d);
127b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
128b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
129b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int simulatedPlatformVersion = getParams().getSimulatedPlatformVersion();
130b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        HardwareConfig hwConfig = getParams().getHardwareConfig();
131b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        Density density = hwConfig.getDensity();
132b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        boolean isRtl = Bridge.isLocaleRtl(getParams().getLocale());
133a9090705efcc44f015486944e5aeb926173a7968Deepanshu Gupta        setLayoutDirection(isRtl? LAYOUT_DIRECTION_RTL : LAYOUT_DIRECTION_LTR);
134b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
135b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        NavigationBar navBar = null;
136fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        if (mBuilder.hasNavBar()) {
137b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            navBar = createNavBar(getContext(), density, isRtl, getParams().isRtlSupported(),
138b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    simulatedPlatformVersion);
139b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
140b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
141b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        StatusBar statusBar = null;
142b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (builder.mStatusBarSize > 0) {
143b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            statusBar = createStatusBar(getContext(), density, isRtl, getParams().isRtlSupported(),
144b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    simulatedPlatformVersion);
145b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
146b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
147b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        View actionBar = null;
148b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        TitleBar titleBar = null;
149b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (builder.mActionBarSize > 0) {
150b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            BridgeActionBar bar = createActionBar(getContext(), getParams());
151b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            mContentRoot = bar.getContentRoot();
152b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            actionBar = bar.getRootView();
153b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        } else if (mBuilder.mTitleBarSize > 0) {
154b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            titleBar = createTitleBar(getContext(), getParams().getAppLabel(),
155b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    simulatedPlatformVersion);
156b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
157b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
158b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        addViews(titleBar, mContentRoot == null ? (mContentRoot = createContentFrame()) : actionBar,
159b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                statusBar, navBar);
160b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        // Done with the builder. Don't hold a reference to it.
161b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        mBuilder = null;
162b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     }
163b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
164b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
165b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private FrameLayout createContentFrame() {
166b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        FrameLayout contentRoot = new FrameLayout(getContext());
167fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams params = createLayoutParams(MATCH_PARENT, MATCH_PARENT);
168b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int rule = mBuilder.isNavBarVertical() ? START_OF : ABOVE;
1696e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        if (mBuilder.hasNavBar() && mBuilder.solidBars()) {
170b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(rule, getId(ID_NAV_BAR));
171b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
172b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int below = -1;
173b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (mBuilder.mActionBarSize <= 0 && mBuilder.mTitleBarSize > 0) {
174b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            below = getId(ID_TITLE_BAR);
1756e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        } else if (mBuilder.hasStatusBar() && mBuilder.solidBars()) {
176b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            below = getId(ID_STATUS_BAR);
177b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
178b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (below != -1) {
179b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(BELOW, below);
180b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
181fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        contentRoot.setLayoutParams(params);
182b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return contentRoot;
183b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
184b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
185b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
186fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta    private LayoutParams createLayoutParams(int width, int height) {
187fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
188fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        if (width > 0) {
189fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta            width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, width, metrics);
190fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        }
191fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        if (height > 0) {
192fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta            height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, height, metrics);
193fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        }
194fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        return new LayoutParams(width, height);
195fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta    }
196fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta
197fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta    @NonNull
198b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    public FrameLayout getContentRoot() {
199b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return mContentRoot;
200b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
201b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
202b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
203b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private SessionParams getParams() {
204b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return mBuilder.mParams;
205b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
206b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
207b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
208b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @Override
209b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    public BridgeContext getContext(){
210b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return (BridgeContext) super.getContext();
211b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
212b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
213b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
214b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * @param isRtl    whether the current locale is an RTL locale.
215b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * @param isRtlSupported    whether the applications supports RTL (i.e. has supportsRtl=true
216b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * in the manifest and targetSdkVersion >= 17.
217b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
218b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
219b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private StatusBar createStatusBar(BridgeContext context, Density density, boolean isRtl,
220b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            boolean isRtlSupported, int simulatedPlatformVersion) {
221b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        StatusBar statusBar =
222b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                new StatusBar(context, density, isRtl, isRtlSupported, simulatedPlatformVersion);
223fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams params = createLayoutParams(MATCH_PARENT, mBuilder.mStatusBarSize);
224b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (mBuilder.isNavBarVertical()) {
225b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(START_OF, getId(ID_NAV_BAR));
226b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
227b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        statusBar.setLayoutParams(params);
228b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        statusBar.setId(getId(ID_STATUS_BAR));
229b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return statusBar;
230b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
231b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
232b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private BridgeActionBar createActionBar(@NonNull BridgeContext context,
233b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            @NonNull SessionParams params) {
234790e5f6c1cab43fb377d86d3c9189a509b28b217Diego Perez        boolean isMenu = "menu".equals(params.getFlag(RenderParamsFlags.FLAG_KEY_ROOT_TAG));
235790e5f6c1cab43fb377d86d3c9189a509b28b217Diego Perez
236b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        BridgeActionBar actionBar;
237fb175664469f1eb1bc598f54a7f86ff008e88b0eDiego Perez        if (context.isAppCompatTheme() && !isMenu) {
238b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            actionBar = new AppCompatActionBar(context, params);
239b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        } else {
240b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            actionBar = new FrameworkActionBar(context, params);
241b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
242fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams layoutParams = createLayoutParams(MATCH_PARENT, MATCH_PARENT);
243b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int rule = mBuilder.isNavBarVertical() ? START_OF : ABOVE;
2446e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        if (mBuilder.hasNavBar() && mBuilder.solidBars()) {
245b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            layoutParams.addRule(rule, getId(ID_NAV_BAR));
246b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
2476e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        if (mBuilder.hasStatusBar() && mBuilder.solidBars()) {
248b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            layoutParams.addRule(BELOW, getId(ID_STATUS_BAR));
249b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
250b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        actionBar.getRootView().setLayoutParams(layoutParams);
251b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        actionBar.createMenuPopup();
252b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return actionBar;
253b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
254b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
255b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
256b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private TitleBar createTitleBar(BridgeContext context, String title,
257b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            int simulatedPlatformVersion) {
258b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        TitleBar titleBar = new TitleBar(context, title, simulatedPlatformVersion);
259fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams params = createLayoutParams(MATCH_PARENT, mBuilder.mTitleBarSize);
2606e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        if (mBuilder.hasStatusBar() && mBuilder.solidBars()) {
261b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(BELOW, getId(ID_STATUS_BAR));
262b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
263fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        if (mBuilder.isNavBarVertical() && mBuilder.solidBars()) {
264b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(START_OF, getId(ID_NAV_BAR));
265b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
266b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        titleBar.setLayoutParams(params);
267b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        titleBar.setId(getId(ID_TITLE_BAR));
268b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return titleBar;
269b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
270b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
271b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
272b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * @param isRtl    whether the current locale is an RTL locale.
273b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * @param isRtlSupported    whether the applications supports RTL (i.e. has supportsRtl=true
274b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * in the manifest and targetSdkVersion >= 17.
275b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
276b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
277b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private NavigationBar createNavBar(BridgeContext context, Density density, boolean isRtl,
278b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            boolean isRtlSupported, int simulatedPlatformVersion) {
279b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int orientation = mBuilder.mNavBarOrientation;
280b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int size = mBuilder.mNavBarSize;
281b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        NavigationBar navBar = new NavigationBar(context, density, orientation, isRtl,
282b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                isRtlSupported, simulatedPlatformVersion);
283b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        boolean isVertical = mBuilder.isNavBarVertical();
284b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int w = isVertical ? size : MATCH_PARENT;
285b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int h = isVertical ? MATCH_PARENT : size;
286fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams params = createLayoutParams(w, h);
287b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        params.addRule(isVertical ? ALIGN_PARENT_END : ALIGN_PARENT_BOTTOM);
288b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        navBar.setLayoutParams(params);
289b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        navBar.setId(getId(ID_NAV_BAR));
290b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return navBar;
291b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
292b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
293b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private void addViews(@NonNull View... views) {
294b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        for (View view : views) {
295b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (view != null) {
296b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                addView(view);
297b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
298b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
299b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
300b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
301b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private int getId(String name) {
302b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return Bridge.getResourceId(ResourceType.ID, ID_PREFIX + name);
303b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
304b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
305b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
306b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * A helper class to help initialize the Layout.
307b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
308b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    static class Builder {
309b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        @NonNull
310b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final SessionParams mParams;
311b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        @NonNull
312b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final BridgeContext mContext;
313b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final RenderResources mResources;
314b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
315b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final boolean mWindowIsFloating;
316b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private ResourceValue mWindowBackground;
317b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mStatusBarSize;
318b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mNavBarSize;
319b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mNavBarOrientation;
320b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mActionBarSize;
321b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mTitleBarSize;
322fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean mTranslucentStatus;
323fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean mTranslucentNav;
324b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
325b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        public Builder(@NonNull SessionParams params, @NonNull BridgeContext context) {
326b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            mParams = params;
327b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            mContext = context;
328b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            mResources = mParams.getResources();
329671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta            mWindowIsFloating = getBooleanThemeValue(mResources, ATTR_WINDOW_FLOATING, true, true);
330b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
331b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            findBackground();
33271a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez
33371a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez            if (!mParams.isForceNoDecor()) {
33471a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez                findStatusBar();
33571a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez                findActionBar();
33671a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez                findNavBar();
33771a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez            }
338b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
339b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
340b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private void findBackground() {
341b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (!mParams.isBgColorOverridden()) {
342b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mWindowBackground = mResources.findItemInTheme(ATTR_WINDOW_BACKGROUND, true);
343b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mWindowBackground = mResources.resolveResValue(mWindowBackground);
344b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
345b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
346b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
347b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private void findStatusBar() {
348b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            boolean windowFullScreen =
349671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta                    getBooleanThemeValue(mResources, ATTR_WINDOW_FULL_SCREEN, true, false);
350b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (!windowFullScreen && !mWindowIsFloating) {
351b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mStatusBarSize =
352b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                        getDimension(ATTR_STATUS_BAR_HEIGHT, true, DEFAULT_STATUS_BAR_HEIGHT);
353671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta                mTranslucentStatus = getBooleanThemeValue(mResources,
354fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta                        ATTR_WINDOW_TRANSLUCENT_STATUS, true, false);
355b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
356b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
357b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
358b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private void  findActionBar() {
359b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (mWindowIsFloating) {
360b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                return;
361b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
362b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            // Check if an actionbar is needed
363c7c3636c2f460b9024673eb5b047a26ce09a61e0Diego Perez            boolean isMenu = "menu".equals(mParams.getFlag(RenderParamsFlags.FLAG_KEY_ROOT_TAG));
364c7c3636c2f460b9024673eb5b047a26ce09a61e0Diego Perez            boolean windowActionBar = isMenu ||
365c7c3636c2f460b9024673eb5b047a26ce09a61e0Diego Perez                    getBooleanThemeValue(mResources, ATTR_WINDOW_ACTION_BAR,
366c7c3636c2f460b9024673eb5b047a26ce09a61e0Diego Perez                            !mContext.isAppCompatTheme(), true);
367b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (windowActionBar) {
368b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mActionBarSize = getDimension(ATTR_ACTION_BAR_SIZE, true, DEFAULT_TITLE_BAR_HEIGHT);
369b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            } else {
370b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                // Maybe the gingerbread era title bar is needed
371b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                boolean windowNoTitle =
372671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta                        getBooleanThemeValue(mResources, ATTR_WINDOW_NO_TITLE, true, false);
373b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (!windowNoTitle) {
374b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    mTitleBarSize =
375b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                            getDimension(ATTR_WINDOW_TITLE_SIZE, true, DEFAULT_TITLE_BAR_HEIGHT);
376b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
377b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
378b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
379b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
380b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private void findNavBar() {
381b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (hasSoftwareButtons() && !mWindowIsFloating) {
382b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
383b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                // get orientation
384b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                HardwareConfig hwConfig = mParams.getHardwareConfig();
385b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                boolean barOnBottom = true;
386b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
387b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (hwConfig.getOrientation() == ScreenOrientation.LANDSCAPE) {
388b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    int shortSize = hwConfig.getScreenHeight();
389b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT /
390b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                            hwConfig.getDensity().getDpiValue();
391b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
392b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    // 0-599dp: "phone" UI with bar on the side
393b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    // 600+dp: "tablet" UI with bar on the bottom
394b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    barOnBottom = shortSizeDp >= 600;
395b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
396b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
397b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mNavBarOrientation = barOnBottom ? LinearLayout.HORIZONTAL : VERTICAL;
398b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mNavBarSize = getDimension(barOnBottom ? ATTR_NAV_BAR_HEIGHT : ATTR_NAV_BAR_WIDTH,
399b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                        true, DEFAULT_NAV_BAR_SIZE);
400671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta                mTranslucentNav = getBooleanThemeValue(mResources,
401fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta                        ATTR_WINDOW_TRANSLUCENT_NAV, true, false);
402b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
403b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
404b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
405b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int getDimension(String attr, boolean isFramework, int defaultValue) {
406b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            ResourceValue value = mResources.findItemInTheme(attr, isFramework);
407b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            value = mResources.resolveResValue(value);
408b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (value != null) {
409b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                TypedValue typedValue = ResourceHelper.getValue(attr, value.getValue(), true);
410b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (typedValue != null) {
411b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    return (int) typedValue.getDimension(mContext.getMetrics());
412b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
413b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
414b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            return defaultValue;
415b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
416b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
417b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private boolean hasSoftwareButtons() {
418b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            return mParams.getHardwareConfig().hasSoftwareButtons();
419b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
420b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
421fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        /**
4226e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta         * Return true if the status bar or nav bar are present, they are not translucent (i.e
4236e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta         * content doesn't overlap with them).
424fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta         */
425fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean solidBars() {
4266e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta            return !(hasNavBar() && mTranslucentNav) && !(hasStatusBar() && mTranslucentStatus);
427fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        }
428fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta
429fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean hasNavBar() {
430fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta            return Config.showOnScreenNavBar(mParams.getSimulatedPlatformVersion()) &&
431fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta                    hasSoftwareButtons() && mNavBarSize > 0;
432fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        }
4336e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta
4346e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        private boolean hasStatusBar() {
4356e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta            return mStatusBarSize > 0;
4366e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        }
4376e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta
4386e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        /**
4396e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta         * Return true if the nav bar is present and is vertical.
4406e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta         */
4416e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        private boolean isNavBarVertical() {
4426e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta            return hasNavBar() && mNavBarOrientation == VERTICAL;
4436e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        }
444b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
445b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta}
446