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