1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2011 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License. 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage com.android.layoutlib.bridge.bars; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 1958ca246c834d7ab45939367367a5932d8e348f41Deepanshu Guptaimport com.android.layoutlib.bridge.android.BridgeContext; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.resources.Density; 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 22139d6ff12d395a888624113fdd2521861b47d761Deepanshu Guptaimport android.util.DisplayMetrics; 239b39c49bfcf9caf434799976304e492ef4599b86Diego Perezimport android.view.View; 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.widget.LinearLayout; 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.widget.TextView; 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic class NavigationBar extends CustomBar { 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 2958ca246c834d7ab45939367367a5932d8e348f41Deepanshu Gupta /** Navigation bar background color attribute name. */ 3058ca246c834d7ab45939367367a5932d8e348f41Deepanshu Gupta private static final String ATTR_COLOR = "navigationBarColor"; 31fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta /** Attribute for translucency property. */ 32fc8f4aad7395eca11f6d9b82eb266b1f4ee5041bDeepanshu Gupta public static final String ATTR_TRANSLUCENT = "windowTranslucentNavigation"; 33139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta // These correspond to @dimen/navigation_side_padding in the system ui code. 34139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta private static final int PADDING_WIDTH_DEFAULT = 36; 35139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta private static final int PADDING_WIDTH_SW360 = 40; 36139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta private static final int PADDING_WIDTH_SW400 = 50; 37139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta // These corresponds to @dimen/navigation_key_width in the system ui code. 38139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta private static final int WIDTH_DEFAULT = 36; 39139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta private static final int WIDTH_SW360 = 40; 40139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta private static final int WIDTH_SW600 = 48; 413b90b74cf96c88267e20a410b639b68de84c3323Jerome Gaillard protected static final String LAYOUT_XML = "/bars/navigation_bar.xml"; 4271dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta private static final String LAYOUT_600DP_XML = "/bars/navigation_bar600dp.xml"; 4371dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta 443b90b74cf96c88267e20a410b639b68de84c3323Jerome Gaillard public NavigationBar(BridgeContext context, Density density, int orientation, boolean isRtl, 453b90b74cf96c88267e20a410b639b68de84c3323Jerome Gaillard boolean rtlEnabled, int simulatedPlatformVersion) { 463b90b74cf96c88267e20a410b639b68de84c3323Jerome Gaillard this(context, density, orientation, isRtl, rtlEnabled, simulatedPlatformVersion, 473b90b74cf96c88267e20a410b639b68de84c3323Jerome Gaillard getShortestWidth(context)>= 600 ? LAYOUT_600DP_XML : LAYOUT_XML); 489b39c49bfcf9caf434799976304e492ef4599b86Diego Perez } 499b39c49bfcf9caf434799976304e492ef4599b86Diego Perez 503b90b74cf96c88267e20a410b639b68de84c3323Jerome Gaillard protected NavigationBar(BridgeContext context, Density density, int orientation, boolean isRtl, 513b90b74cf96c88267e20a410b639b68de84c3323Jerome Gaillard boolean rtlEnabled, int simulatedPlatformVersion, String layoutPath) { 523b90b74cf96c88267e20a410b639b68de84c3323Jerome Gaillard super(context, orientation, layoutPath, "navigation_bar.xml", simulatedPlatformVersion); 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 544ea74d2960688db6aa13452765dd5f2d07a40189Deepanshu Gupta int color = getBarColor(ATTR_COLOR, ATTR_TRANSLUCENT); 554ea74d2960688db6aa13452765dd5f2d07a40189Deepanshu Gupta setBackgroundColor(color == 0 ? 0xFF000000 : color); 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Cannot access the inside items through id because no R.id values have been 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // created for them. 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // We do know the order though. 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // 0 is a spacer. 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int back = 1; 62139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta int recent = 5; 638930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta if (orientation == LinearLayout.VERTICAL || (isRtl && !rtlEnabled)) { 648930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta // If RTL is enabled, then layoutlib mirrors the layout for us. 65139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta back = 5; 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski recent = 1; 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 6942c7ce02f4023c94b315253754a20c20800be731Deepanshu Gupta //noinspection SpellCheckingInspection 70139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta loadIcon(back, "ic_sysbar_back.png", density, isRtl); 7142c7ce02f4023c94b315253754a20c20800be731Deepanshu Gupta //noinspection SpellCheckingInspection 72139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta loadIcon(3, "ic_sysbar_home.png", density, isRtl); 7342c7ce02f4023c94b315253754a20c20800be731Deepanshu Gupta //noinspection SpellCheckingInspection 748930cb4f37ff0fbde65f7afd4bbe06ab77677f78Deepanshu Gupta loadIcon(recent, "ic_sysbar_recent.png", density, isRtl); 75139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta setupNavBar(context, orientation); 76139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } 77139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta 78139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta private void setupNavBar(BridgeContext context, int orientation) { 7971dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta float sw = getShortestWidth(context); 80139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta View leftPadding = getChildAt(0); 81139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta View rightPadding = getChildAt(6); 8271dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta setSize(context, leftPadding, orientation, getSidePadding(sw)); 8371dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta setSize(context, rightPadding, orientation, getSidePadding(sw)); 8471dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta int navButtonWidth = getWidth(sw); 85139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta for (int i = 1; i < 6; i += 2) { 86139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta View navButton = getChildAt(i); 8771dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta setSize(context, navButton, orientation, navButtonWidth); 8871dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta } 8971dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta if (sw >= 600) { 9071dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta setSize(context, getChildAt(2), orientation, 128); 9171dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta setSize(context, getChildAt(4), orientation, 128); 92139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } 93139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } 94139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta 95139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta private static void setSize(BridgeContext context, View view, int orientation, int size) { 96139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta size *= context.getMetrics().density; 97139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta LayoutParams layoutParams = (LayoutParams) view.getLayoutParams(); 98139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta if (orientation == HORIZONTAL) { 99139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta layoutParams.width = size; 100139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } else { 101139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta layoutParams.height = size; 102139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } 103139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta view.setLayoutParams(layoutParams); 104139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } 105139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta 1063b90b74cf96c88267e20a410b639b68de84c3323Jerome Gaillard protected int getSidePadding(float sw) { 107139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta if (sw >= 400) { 108139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta return PADDING_WIDTH_SW400; 109139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } 110139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta if (sw >= 360) { 111139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta return PADDING_WIDTH_SW360; 112139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } 113139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta return PADDING_WIDTH_DEFAULT; 114139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } 115139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta 11671dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta private static int getWidth(float sw) { 117139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta if (sw >= 600) { 118139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta return WIDTH_SW600; 119139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } 120139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta if (sw >= 360) { 121139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta return WIDTH_SW360; 122139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta } 123139d6ff12d395a888624113fdd2521861b47d761Deepanshu Gupta return WIDTH_DEFAULT; 124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 12671dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta private static float getShortestWidth(BridgeContext context) { 12771dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta DisplayMetrics metrics = context.getMetrics(); 12871dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta float sw = metrics.widthPixels < metrics.heightPixels ? 12971dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta metrics.widthPixels : metrics.heightPixels; 13071dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta sw /= metrics.density; 13171dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta return sw; 13271dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta } 13371dc5ee2244aa409c0426d3583a014e30d6cf07eDeepanshu Gupta 134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski protected TextView getStyleableTextView() { 136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 139