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