Layout.java revision 71a85575d41d08e1fcde5cd5c996e948b368a1ff
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.ide.common.rendering.api.StyleResourceValue;
24b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.Bridge;
25b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport com.android.layoutlib.bridge.android.BridgeContext;
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";
86b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu 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    private static final String PREFIX_THEME_APPCOMPAT = "Theme.AppCompat";
97b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
98b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Default sizes
99b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final int DEFAULT_STATUS_BAR_HEIGHT = 25;
100b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final int DEFAULT_TITLE_BAR_HEIGHT = 25;
101b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final int DEFAULT_NAV_BAR_SIZE = 48;
102b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
103b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Ids assigned to components created. This is so that we can refer to other components in
104b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // layout params.
105b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_NAV_BAR = "navBar";
106b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_STATUS_BAR = "statusBar";
107b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_TITLE_BAR = "titleBar";
108b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Prefix used with the above ids in order to make them unique in framework namespace.
109b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_PREFIX = "android_layoutlib_";
110b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
111b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
112b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * Temporarily store the builder so that it doesn't have to be passed to all methods used
113b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * during inflation.
114b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
115b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private Builder mBuilder;
116b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
117b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
118b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * This holds user's layout.
119b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
120b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private FrameLayout mContentRoot;
121b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
122b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    public Layout(@NonNull Builder builder) {
123b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        super(builder.mContext);
124b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        mBuilder = builder;
125b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (builder.mWindowBackground != null) {
126b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            Drawable d = ResourceHelper.getDrawable(builder.mWindowBackground, builder.mContext);
127b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            setBackground(d);
128b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
129b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
130b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int simulatedPlatformVersion = getParams().getSimulatedPlatformVersion();
131b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        HardwareConfig hwConfig = getParams().getHardwareConfig();
132b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        Density density = hwConfig.getDensity();
133b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        boolean isRtl = Bridge.isLocaleRtl(getParams().getLocale());
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) {
234b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        BridgeActionBar actionBar;
235b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (mBuilder.isThemeAppCompat()) {
236b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            actionBar = new AppCompatActionBar(context, params);
237b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        } else {
238b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            actionBar = new FrameworkActionBar(context, params);
239b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
240fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams layoutParams = createLayoutParams(MATCH_PARENT, MATCH_PARENT);
241b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int rule = mBuilder.isNavBarVertical() ? START_OF : ABOVE;
2426e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        if (mBuilder.hasNavBar() && mBuilder.solidBars()) {
243b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            layoutParams.addRule(rule, getId(ID_NAV_BAR));
244b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
2456e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        if (mBuilder.hasStatusBar() && mBuilder.solidBars()) {
246b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            layoutParams.addRule(BELOW, getId(ID_STATUS_BAR));
247b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
248b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        actionBar.getRootView().setLayoutParams(layoutParams);
249b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        actionBar.createMenuPopup();
250b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return actionBar;
251b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
252b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
253b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
254b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private TitleBar createTitleBar(BridgeContext context, String title,
255b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            int simulatedPlatformVersion) {
256b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        TitleBar titleBar = new TitleBar(context, title, simulatedPlatformVersion);
257fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams params = createLayoutParams(MATCH_PARENT, mBuilder.mTitleBarSize);
2586e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        if (mBuilder.hasStatusBar() && mBuilder.solidBars()) {
259b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(BELOW, getId(ID_STATUS_BAR));
260b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
261fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        if (mBuilder.isNavBarVertical() && mBuilder.solidBars()) {
262b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(START_OF, getId(ID_NAV_BAR));
263b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
264b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        titleBar.setLayoutParams(params);
265b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        titleBar.setId(getId(ID_TITLE_BAR));
266b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return titleBar;
267b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
268b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
269b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
270b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * @param isRtl    whether the current locale is an RTL locale.
271b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * @param isRtlSupported    whether the applications supports RTL (i.e. has supportsRtl=true
272b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * in the manifest and targetSdkVersion >= 17.
273b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
274b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
275b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private NavigationBar createNavBar(BridgeContext context, Density density, boolean isRtl,
276b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            boolean isRtlSupported, int simulatedPlatformVersion) {
277b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int orientation = mBuilder.mNavBarOrientation;
278b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int size = mBuilder.mNavBarSize;
279b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        NavigationBar navBar = new NavigationBar(context, density, orientation, isRtl,
280b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                isRtlSupported, simulatedPlatformVersion);
281b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        boolean isVertical = mBuilder.isNavBarVertical();
282b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int w = isVertical ? size : MATCH_PARENT;
283b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int h = isVertical ? MATCH_PARENT : size;
284fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams params = createLayoutParams(w, h);
285b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        params.addRule(isVertical ? ALIGN_PARENT_END : ALIGN_PARENT_BOTTOM);
286b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        navBar.setLayoutParams(params);
287b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        navBar.setId(getId(ID_NAV_BAR));
288b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return navBar;
289b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
290b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
291b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private void addViews(@NonNull View... views) {
292b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        for (View view : views) {
293b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (view != null) {
294b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                addView(view);
295b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
296b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
297b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
298b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
299b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private int getId(String name) {
300b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return Bridge.getResourceId(ResourceType.ID, ID_PREFIX + name);
301b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
302b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
303b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
304b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * A helper class to help initialize the Layout.
305b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
306b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    static class Builder {
307b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        @NonNull
308b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final SessionParams mParams;
309b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        @NonNull
310b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final BridgeContext mContext;
311b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final RenderResources mResources;
312b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
313b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final boolean mWindowIsFloating;
314b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private ResourceValue mWindowBackground;
315b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mStatusBarSize;
316b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mNavBarSize;
317b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mNavBarOrientation;
318b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mActionBarSize;
319b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mTitleBarSize;
320fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean mTranslucentStatus;
321fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean mTranslucentNav;
322b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
323b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private Boolean mIsThemeAppCompat;
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
363671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta            boolean windowActionBar = getBooleanThemeValue(mResources, ATTR_WINDOW_ACTION_BAR,
364fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta                    !isThemeAppCompat(), true);
365b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (windowActionBar) {
366b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mActionBarSize = getDimension(ATTR_ACTION_BAR_SIZE, true, DEFAULT_TITLE_BAR_HEIGHT);
367b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            } else {
368b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                // Maybe the gingerbread era title bar is needed
369b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                boolean windowNoTitle =
370671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta                        getBooleanThemeValue(mResources, ATTR_WINDOW_NO_TITLE, true, false);
371b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (!windowNoTitle) {
372b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    mTitleBarSize =
373b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                            getDimension(ATTR_WINDOW_TITLE_SIZE, true, DEFAULT_TITLE_BAR_HEIGHT);
374b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
375b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
376b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
377b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
378b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private void findNavBar() {
379b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (hasSoftwareButtons() && !mWindowIsFloating) {
380b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
381b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                // get orientation
382b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                HardwareConfig hwConfig = mParams.getHardwareConfig();
383b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                boolean barOnBottom = true;
384b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
385b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (hwConfig.getOrientation() == ScreenOrientation.LANDSCAPE) {
386b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    int shortSize = hwConfig.getScreenHeight();
387b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT /
388b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                            hwConfig.getDensity().getDpiValue();
389b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
390b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    // 0-599dp: "phone" UI with bar on the side
391b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    // 600+dp: "tablet" UI with bar on the bottom
392b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    barOnBottom = shortSizeDp >= 600;
393b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
394b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
395b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mNavBarOrientation = barOnBottom ? LinearLayout.HORIZONTAL : VERTICAL;
396b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mNavBarSize = getDimension(barOnBottom ? ATTR_NAV_BAR_HEIGHT : ATTR_NAV_BAR_WIDTH,
397b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                        true, DEFAULT_NAV_BAR_SIZE);
398671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta                mTranslucentNav = getBooleanThemeValue(mResources,
399fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta                        ATTR_WINDOW_TRANSLUCENT_NAV, true, false);
400b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
401b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
402b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
403b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int getDimension(String attr, boolean isFramework, int defaultValue) {
404b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            ResourceValue value = mResources.findItemInTheme(attr, isFramework);
405b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            value = mResources.resolveResValue(value);
406b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (value != null) {
407b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                TypedValue typedValue = ResourceHelper.getValue(attr, value.getValue(), true);
408b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (typedValue != null) {
409b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    return (int) typedValue.getDimension(mContext.getMetrics());
410b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
411b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
412b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            return defaultValue;
413b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
414b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
415b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private boolean hasSoftwareButtons() {
416b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            return mParams.getHardwareConfig().hasSoftwareButtons();
417b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
418b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
419b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private boolean isThemeAppCompat() {
420b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            // If a cached value exists, return it.
421b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (mIsThemeAppCompat != null) {
422b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                return mIsThemeAppCompat;
423b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
424b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            // Ideally, we should check if the corresponding activity extends
425b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            // android.support.v7.app.ActionBarActivity, and not care about the theme name at all.
426b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            StyleResourceValue defaultTheme = mResources.getDefaultTheme();
427b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            // We can't simply check for parent using resources.themeIsParentOf() since the
428b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            // inheritance structure isn't really what one would expect. The first common parent
429b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            // between Theme.AppCompat.Light and Theme.AppCompat is Theme.Material (for v21).
430b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            boolean isThemeAppCompat = false;
431b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            for (int i = 0; i < 50; i++) {
432b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (defaultTheme == null) {
433b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    break;
434b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
435b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                // for loop ensures that we don't run into cyclic theme inheritance.
436b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (defaultTheme.getName().startsWith(PREFIX_THEME_APPCOMPAT)) {
437b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    isThemeAppCompat = true;
438b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    break;
439b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
440b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                defaultTheme = mResources.getParent(defaultTheme);
441b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
442b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            mIsThemeAppCompat = isThemeAppCompat;
443b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            return isThemeAppCompat;
444b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
445fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta
446fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        /**
4476e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta         * Return true if the status bar or nav bar are present, they are not translucent (i.e
4486e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta         * content doesn't overlap with them).
449fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta         */
450fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean solidBars() {
4516e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta            return !(hasNavBar() && mTranslucentNav) && !(hasStatusBar() && mTranslucentStatus);
452fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        }
453fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta
454fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean hasNavBar() {
455fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta            return Config.showOnScreenNavBar(mParams.getSimulatedPlatformVersion()) &&
456fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta                    hasSoftwareButtons() && mNavBarSize > 0;
457fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        }
4586e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta
4596e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        private boolean hasStatusBar() {
4606e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta            return mStatusBarSize > 0;
4616e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        }
4626e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta
4636e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        /**
4646e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta         * Return true if the nav bar is present and is vertical.
4656e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta         */
4666e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        private boolean isNavBarVertical() {
4676e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta            return hasNavBar() && mNavBarOrientation == VERTICAL;
4686e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        }
469b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
470b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta}
471