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