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;
41b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perezimport android.view.AttachInfo_Accessor;
42b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.view.View;
43b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perezimport android.view.ViewRootImpl;
44b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perezimport android.view.ViewRootImpl_Accessor;
45b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.widget.FrameLayout;
46b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.widget.LinearLayout;
47b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport android.widget.RelativeLayout;
48b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
49b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
50b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaimport static android.widget.LinearLayout.VERTICAL;
51671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Guptaimport static com.android.layoutlib.bridge.impl.ResourceHelper.getBooleanThemeValue;
52b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
53b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta/**
54b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * The Layout used to create the system decor.
55b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *
56b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * The layout inflated will contain a content frame where the user's layout can be inflated.
57b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * <pre>
58b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------------------+---+
59b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Status bar                                      | N |
60b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------------------+ a |
61b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Title/Action bar (optional)                     | v |
62b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------------------+   |
63b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Content, vertical extending                     | b |
64b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  |                                                 | a |
65b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  |                                                 | r |
66b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------------------+---+
67b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * </pre>
68b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * or
69b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * <pre>
70b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------+
71b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Status bar                          |
72b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------+
73b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Title/Action bar (optional)         |
74b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------+
75b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Content, vertical extending         |
76b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  |                                     |
77b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  |                                     |
78b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------+
79b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  | Nav bar                             |
80b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *  +-------------------------------------+
81b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta * </pre>
82b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta *
83b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta */
84b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Guptaclass Layout extends RelativeLayout {
85b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
86b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Theme attributes used for configuring appearance of the system decor.
87b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_WINDOW_FLOATING = "windowIsFloating";
88b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_WINDOW_BACKGROUND = "windowBackground";
895a8f33f1b09b0311f1bbd1ec6b90db706edb5219Deepanshu Gupta    private static final String ATTR_WINDOW_FULL_SCREEN = "windowFullscreen";
90b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_NAV_BAR_HEIGHT = "navigation_bar_height";
91b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_NAV_BAR_WIDTH = "navigation_bar_width";
92b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_STATUS_BAR_HEIGHT = "status_bar_height";
93b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_WINDOW_ACTION_BAR = "windowActionBar";
94b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_ACTION_BAR_SIZE = "actionBarSize";
95b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_WINDOW_NO_TITLE = "windowNoTitle";
96b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ATTR_WINDOW_TITLE_SIZE = "windowTitleSize";
97fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta    private static final String ATTR_WINDOW_TRANSLUCENT_STATUS = StatusBar.ATTR_TRANSLUCENT;
98fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta    private static final String ATTR_WINDOW_TRANSLUCENT_NAV = NavigationBar.ATTR_TRANSLUCENT;
99b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
100b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Default sizes
101b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final int DEFAULT_STATUS_BAR_HEIGHT = 25;
102b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final int DEFAULT_TITLE_BAR_HEIGHT = 25;
103b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final int DEFAULT_NAV_BAR_SIZE = 48;
104b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
105b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Ids assigned to components created. This is so that we can refer to other components in
106b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // layout params.
107b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_NAV_BAR = "navBar";
108b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_STATUS_BAR = "statusBar";
109b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_TITLE_BAR = "titleBar";
110b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    // Prefix used with the above ids in order to make them unique in framework namespace.
111b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private static final String ID_PREFIX = "android_layoutlib_";
112b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
113b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
114b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * Temporarily store the builder so that it doesn't have to be passed to all methods used
115b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * during inflation.
116b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
117b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private Builder mBuilder;
118b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
119b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
120b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * This holds user's layout.
121b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
122b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private FrameLayout mContentRoot;
123b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
124b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    public Layout(@NonNull Builder builder) {
125b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        super(builder.mContext);
126b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        mBuilder = builder;
127b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (builder.mWindowBackground != null) {
128b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            Drawable d = ResourceHelper.getDrawable(builder.mWindowBackground, builder.mContext);
129b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            setBackground(d);
130b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
131b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
132b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int simulatedPlatformVersion = getParams().getSimulatedPlatformVersion();
133b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        HardwareConfig hwConfig = getParams().getHardwareConfig();
134b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        Density density = hwConfig.getDensity();
135b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        boolean isRtl = Bridge.isLocaleRtl(getParams().getLocale());
136a9090705efcc44f015486944e5aeb926173a7968Deepanshu Gupta        setLayoutDirection(isRtl? LAYOUT_DIRECTION_RTL : LAYOUT_DIRECTION_LTR);
137b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
138b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        NavigationBar navBar = null;
139fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        if (mBuilder.hasNavBar()) {
140b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            navBar = createNavBar(getContext(), density, isRtl, getParams().isRtlSupported(),
141b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    simulatedPlatformVersion);
142b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
143b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
144b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        StatusBar statusBar = null;
145b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (builder.mStatusBarSize > 0) {
146b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            statusBar = createStatusBar(getContext(), density, isRtl, getParams().isRtlSupported(),
147b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    simulatedPlatformVersion);
148b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
149b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
150b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        View actionBar = null;
151b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        TitleBar titleBar = null;
152b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (builder.mActionBarSize > 0) {
153b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            BridgeActionBar bar = createActionBar(getContext(), getParams());
154b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            mContentRoot = bar.getContentRoot();
155b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            actionBar = bar.getRootView();
156b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        } else if (mBuilder.mTitleBarSize > 0) {
157b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            titleBar = createTitleBar(getContext(), getParams().getAppLabel(),
158b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    simulatedPlatformVersion);
159b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
160b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
161b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        addViews(titleBar, mContentRoot == null ? (mContentRoot = createContentFrame()) : actionBar,
162b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                statusBar, navBar);
163b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        // Done with the builder. Don't hold a reference to it.
164b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        mBuilder = null;
165b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     }
166b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
167b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
168b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private FrameLayout createContentFrame() {
169b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        FrameLayout contentRoot = new FrameLayout(getContext());
170fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams params = createLayoutParams(MATCH_PARENT, MATCH_PARENT);
171b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int rule = mBuilder.isNavBarVertical() ? START_OF : ABOVE;
17248a285ce1bfc663187731830627410cc6ff406c8Diego Perez        if (mBuilder.hasSolidNavBar()) {
173b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(rule, getId(ID_NAV_BAR));
174b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
175b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int below = -1;
176b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (mBuilder.mActionBarSize <= 0 && mBuilder.mTitleBarSize > 0) {
177b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            below = getId(ID_TITLE_BAR);
17848a285ce1bfc663187731830627410cc6ff406c8Diego Perez        } else if (mBuilder.hasSolidStatusBar()) {
179b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            below = getId(ID_STATUS_BAR);
180b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
181b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (below != -1) {
182b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(BELOW, below);
183b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
184fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        contentRoot.setLayoutParams(params);
185b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return contentRoot;
186b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
187b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
188b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
189fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta    private LayoutParams createLayoutParams(int width, int height) {
190fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
191fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        if (width > 0) {
192fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta            width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, width, metrics);
193fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        }
194fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        if (height > 0) {
195fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta            height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, height, metrics);
196fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        }
197fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        return new LayoutParams(width, height);
198fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta    }
199fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta
200fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta    @NonNull
201b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    public FrameLayout getContentRoot() {
202b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return mContentRoot;
203b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
204b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
205b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
206b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private SessionParams getParams() {
207b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return mBuilder.mParams;
208b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
209b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
210b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
211b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @Override
212b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    public BridgeContext getContext(){
213b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return (BridgeContext) super.getContext();
214b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
215b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
216b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
217b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * @param isRtl    whether the current locale is an RTL locale.
218b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * @param isRtlSupported    whether the applications supports RTL (i.e. has supportsRtl=true
219b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * in the manifest and targetSdkVersion >= 17.
220b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
221b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
222b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private StatusBar createStatusBar(BridgeContext context, Density density, boolean isRtl,
223b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            boolean isRtlSupported, int simulatedPlatformVersion) {
224b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        StatusBar statusBar =
225b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                new StatusBar(context, density, isRtl, isRtlSupported, simulatedPlatformVersion);
226fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams params = createLayoutParams(MATCH_PARENT, mBuilder.mStatusBarSize);
227b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        if (mBuilder.isNavBarVertical()) {
228b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(START_OF, getId(ID_NAV_BAR));
229b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
230b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        statusBar.setLayoutParams(params);
231b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        statusBar.setId(getId(ID_STATUS_BAR));
232b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return statusBar;
233b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
234b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
235b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private BridgeActionBar createActionBar(@NonNull BridgeContext context,
236b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            @NonNull SessionParams params) {
237790e5f6c1cab43fb377d86d3c9189a509b28b217Diego Perez        boolean isMenu = "menu".equals(params.getFlag(RenderParamsFlags.FLAG_KEY_ROOT_TAG));
238790e5f6c1cab43fb377d86d3c9189a509b28b217Diego Perez
239b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        BridgeActionBar actionBar;
240fb175664469f1eb1bc598f54a7f86ff008e88b0eDiego Perez        if (context.isAppCompatTheme() && !isMenu) {
241b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            actionBar = new AppCompatActionBar(context, params);
242b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        } else {
243b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            actionBar = new FrameworkActionBar(context, params);
244b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
245fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams layoutParams = createLayoutParams(MATCH_PARENT, MATCH_PARENT);
246b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int rule = mBuilder.isNavBarVertical() ? START_OF : ABOVE;
24748a285ce1bfc663187731830627410cc6ff406c8Diego Perez        if (mBuilder.hasSolidNavBar()) {
248b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            layoutParams.addRule(rule, getId(ID_NAV_BAR));
249b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
25048a285ce1bfc663187731830627410cc6ff406c8Diego Perez        if (mBuilder.hasSolidStatusBar()) {
251b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            layoutParams.addRule(BELOW, getId(ID_STATUS_BAR));
252b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
253b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        actionBar.getRootView().setLayoutParams(layoutParams);
254b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        actionBar.createMenuPopup();
255b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return actionBar;
256b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
257b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
258b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
259b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private TitleBar createTitleBar(BridgeContext context, String title,
260b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            int simulatedPlatformVersion) {
261b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        TitleBar titleBar = new TitleBar(context, title, simulatedPlatformVersion);
262fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams params = createLayoutParams(MATCH_PARENT, mBuilder.mTitleBarSize);
26348a285ce1bfc663187731830627410cc6ff406c8Diego Perez        if (mBuilder.hasSolidStatusBar()) {
264b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(BELOW, getId(ID_STATUS_BAR));
265b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
26648a285ce1bfc663187731830627410cc6ff406c8Diego Perez        if (mBuilder.isNavBarVertical() && mBuilder.hasSolidNavBar()) {
267b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            params.addRule(START_OF, getId(ID_NAV_BAR));
268b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
269b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        titleBar.setLayoutParams(params);
270b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        titleBar.setId(getId(ID_TITLE_BAR));
271b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return titleBar;
272b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
273b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
274b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
275b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * @param isRtl    whether the current locale is an RTL locale.
276b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * @param isRtlSupported    whether the applications supports RTL (i.e. has supportsRtl=true
277b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * in the manifest and targetSdkVersion >= 17.
278b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
279b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    @NonNull
280b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private NavigationBar createNavBar(BridgeContext context, Density density, boolean isRtl,
281b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            boolean isRtlSupported, int simulatedPlatformVersion) {
282b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int orientation = mBuilder.mNavBarOrientation;
283b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int size = mBuilder.mNavBarSize;
284b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        NavigationBar navBar = new NavigationBar(context, density, orientation, isRtl,
285b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                isRtlSupported, simulatedPlatformVersion);
286b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        boolean isVertical = mBuilder.isNavBarVertical();
287b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int w = isVertical ? size : MATCH_PARENT;
288b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        int h = isVertical ? MATCH_PARENT : size;
289fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        LayoutParams params = createLayoutParams(w, h);
290b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        params.addRule(isVertical ? ALIGN_PARENT_END : ALIGN_PARENT_BOTTOM);
291b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        navBar.setLayoutParams(params);
292b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        navBar.setId(getId(ID_NAV_BAR));
293b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return navBar;
294b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
295b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
296b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private void addViews(@NonNull View... views) {
297b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        for (View view : views) {
298b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (view != null) {
299b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                addView(view);
300b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
301b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
302b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
303b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
304b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    private int getId(String name) {
305b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        return Bridge.getResourceId(ResourceType.ID, ID_PREFIX + name);
306b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
307b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
30862253b6c60b8176edf6af2f0c342fd0668e70dc2Diego Perez    @SuppressWarnings("deprecation")
309b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez    @Override
310b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez    public void requestFitSystemWindows() {
311b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez        // The framework call would usually bubble up to ViewRootImpl but, in layoutlib, Layout will
312b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez        // act as view root for most purposes. That way, we can also save going through the Handler
313b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez        // to dispatch the new applied insets.
314b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez        ViewRootImpl root = AttachInfo_Accessor.getRootView(this);
315b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez        if (root != null) {
316b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez            ViewRootImpl_Accessor.dispatchApplyInsets(root, this);
317b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez        }
318b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez    }
319b076ee1a83099f1394b3fc4850513fcee1ca8bdeDiego Perez
320b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    /**
321b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     * A helper class to help initialize the Layout.
322b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta     */
323b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    static class Builder {
324b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        @NonNull
325b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final SessionParams mParams;
326b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        @NonNull
327b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final BridgeContext mContext;
328b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final RenderResources mResources;
329b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
330b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private final boolean mWindowIsFloating;
331b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private ResourceValue mWindowBackground;
332b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mStatusBarSize;
333b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mNavBarSize;
334b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mNavBarOrientation;
335b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mActionBarSize;
336b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int mTitleBarSize;
337fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean mTranslucentStatus;
338fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean mTranslucentNav;
339b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
340b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        public Builder(@NonNull SessionParams params, @NonNull BridgeContext context) {
341b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            mParams = params;
342b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            mContext = context;
343b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            mResources = mParams.getResources();
344671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta            mWindowIsFloating = getBooleanThemeValue(mResources, ATTR_WINDOW_FLOATING, true, true);
345b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
346b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            findBackground();
34771a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez
34871a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez            if (!mParams.isForceNoDecor()) {
34971a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez                findStatusBar();
35071a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez                findActionBar();
35171a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez                findNavBar();
35271a85575d41d08e1fcde5cd5c996e948b368a1ffDiego Perez            }
353b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
354b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
355b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private void findBackground() {
356b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (!mParams.isBgColorOverridden()) {
357b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mWindowBackground = mResources.findItemInTheme(ATTR_WINDOW_BACKGROUND, true);
358b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mWindowBackground = mResources.resolveResValue(mWindowBackground);
359b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
360b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
361b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
362b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private void findStatusBar() {
363b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            boolean windowFullScreen =
364671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta                    getBooleanThemeValue(mResources, ATTR_WINDOW_FULL_SCREEN, true, false);
365b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (!windowFullScreen && !mWindowIsFloating) {
366b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mStatusBarSize =
367b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                        getDimension(ATTR_STATUS_BAR_HEIGHT, true, DEFAULT_STATUS_BAR_HEIGHT);
368671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta                mTranslucentStatus = getBooleanThemeValue(mResources,
369fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta                        ATTR_WINDOW_TRANSLUCENT_STATUS, true, false);
370b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
371b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
372b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
373b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private void  findActionBar() {
374b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (mWindowIsFloating) {
375b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                return;
376b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
377b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            // Check if an actionbar is needed
378c7c3636c2f460b9024673eb5b047a26ce09a61e0Diego Perez            boolean isMenu = "menu".equals(mParams.getFlag(RenderParamsFlags.FLAG_KEY_ROOT_TAG));
379c7c3636c2f460b9024673eb5b047a26ce09a61e0Diego Perez            boolean windowActionBar = isMenu ||
380c7c3636c2f460b9024673eb5b047a26ce09a61e0Diego Perez                    getBooleanThemeValue(mResources, ATTR_WINDOW_ACTION_BAR,
381c7c3636c2f460b9024673eb5b047a26ce09a61e0Diego Perez                            !mContext.isAppCompatTheme(), true);
382b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (windowActionBar) {
383b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mActionBarSize = getDimension(ATTR_ACTION_BAR_SIZE, true, DEFAULT_TITLE_BAR_HEIGHT);
384b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            } else {
385b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                // Maybe the gingerbread era title bar is needed
386b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                boolean windowNoTitle =
387671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta                        getBooleanThemeValue(mResources, ATTR_WINDOW_NO_TITLE, true, false);
388b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (!windowNoTitle) {
389b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    mTitleBarSize =
390b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                            getDimension(ATTR_WINDOW_TITLE_SIZE, true, DEFAULT_TITLE_BAR_HEIGHT);
391b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
392b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
393b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
394b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
395b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private void findNavBar() {
396b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (hasSoftwareButtons() && !mWindowIsFloating) {
397b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
398b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                // get orientation
399b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                HardwareConfig hwConfig = mParams.getHardwareConfig();
400b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                boolean barOnBottom = true;
401b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
402b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (hwConfig.getOrientation() == ScreenOrientation.LANDSCAPE) {
403b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    int shortSize = hwConfig.getScreenHeight();
404b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    int shortSizeDp = shortSize * DisplayMetrics.DENSITY_DEFAULT /
405b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                            hwConfig.getDensity().getDpiValue();
406b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
407b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    // 0-599dp: "phone" UI with bar on the side
408b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    // 600+dp: "tablet" UI with bar on the bottom
409b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    barOnBottom = shortSizeDp >= 600;
410b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
411b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
412b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mNavBarOrientation = barOnBottom ? LinearLayout.HORIZONTAL : VERTICAL;
413b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                mNavBarSize = getDimension(barOnBottom ? ATTR_NAV_BAR_HEIGHT : ATTR_NAV_BAR_WIDTH,
414b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                        true, DEFAULT_NAV_BAR_SIZE);
415671b7f9b99316f7224c1213d6923d449a2de9b62Deepanshu Gupta                mTranslucentNav = getBooleanThemeValue(mResources,
416fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta                        ATTR_WINDOW_TRANSLUCENT_NAV, true, false);
417b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
418b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
419b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
42062253b6c60b8176edf6af2f0c342fd0668e70dc2Diego Perez        @SuppressWarnings("SameParameterValue")
421b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private int getDimension(String attr, boolean isFramework, int defaultValue) {
422b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            ResourceValue value = mResources.findItemInTheme(attr, isFramework);
423b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            value = mResources.resolveResValue(value);
424b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            if (value != null) {
425b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                TypedValue typedValue = ResourceHelper.getValue(attr, value.getValue(), true);
426b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                if (typedValue != null) {
427b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                    return (int) typedValue.getDimension(mContext.getMetrics());
428b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta                }
429b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            }
430b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            return defaultValue;
431b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
432b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
433b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        private boolean hasSoftwareButtons() {
434b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta            return mParams.getHardwareConfig().hasSoftwareButtons();
435b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta        }
436b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta
437fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        /**
43848a285ce1bfc663187731830627410cc6ff406c8Diego Perez         * Return true if the nav bar is present and not translucent
439fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta         */
44048a285ce1bfc663187731830627410cc6ff406c8Diego Perez        private boolean hasSolidNavBar() {
44148a285ce1bfc663187731830627410cc6ff406c8Diego Perez            return hasNavBar() && !mTranslucentNav;
44248a285ce1bfc663187731830627410cc6ff406c8Diego Perez        }
44348a285ce1bfc663187731830627410cc6ff406c8Diego Perez
44448a285ce1bfc663187731830627410cc6ff406c8Diego Perez        /**
44548a285ce1bfc663187731830627410cc6ff406c8Diego Perez         * Return true if the status bar is present and not translucent
44648a285ce1bfc663187731830627410cc6ff406c8Diego Perez         */
44748a285ce1bfc663187731830627410cc6ff406c8Diego Perez        private boolean hasSolidStatusBar() {
44848a285ce1bfc663187731830627410cc6ff406c8Diego Perez            return hasStatusBar() && !mTranslucentStatus;
449fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        }
450fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta
451fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        private boolean hasNavBar() {
452fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta            return Config.showOnScreenNavBar(mParams.getSimulatedPlatformVersion()) &&
453fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta                    hasSoftwareButtons() && mNavBarSize > 0;
454fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta        }
4556e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta
4566e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        private boolean hasStatusBar() {
4576e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta            return mStatusBarSize > 0;
4586e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        }
4596e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta
4606e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        /**
4616e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta         * Return true if the nav bar is present and is vertical.
4626e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta         */
4636e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        private boolean isNavBarVertical() {
4646e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta            return hasNavBar() && mNavBarOrientation == VERTICAL;
4656e8d8ad2b7cffed751b2a382ac7b761954767188Deepanshu Gupta        }
466b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta    }
467b1484862e2367d87d3ccbd0fd0a6d2598ed5918aDeepanshu Gupta}
468