PhoneStatusBarView.java revision 5a8aefa6c8ab2f129bc6477a49cd0876ec5d72fa
115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root/*
215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Copyright (C) 2008 The Android Open Source Project
315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * you may not use this file except in compliance with the License.
615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * You may obtain a copy of the License at
715a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
815a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
915a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root *
1015a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * Unless required by applicable law or agreed to in writing, software
1115a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1215a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1315a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * See the License for the specific language governing permissions and
1415a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root * limitations under the License.
1515a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root */
1615a4d2ffd04dc6c70f2cd17dae12ac6bc14c69abKenny Root
17fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratopackage com.android.systemui.statusbar.phone;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerimport android.app.ActivityManager;
201e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandlerimport android.app.StatusBarManager;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
22d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackbornimport android.content.res.Configuration;
231c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandlerimport android.content.res.Resources;
245a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandlerimport android.content.res.Resources.NotFoundException;
25d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackbornimport android.graphics.Canvas;
261c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandlerimport android.graphics.Color;
27119a4015f0f7ac1f63d596da158768f880f9fe9bJoe Onoratoimport android.graphics.Rect;
28d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackbornimport android.os.SystemClock;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
30a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackbornimport android.util.Log;
31198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandlerimport android.util.Slog;
32c4f2a5652dd42fdb43a94e341b7a2034b0211a21Daniel Sandlerimport android.view.KeyEvent;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewParent;
376179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.FrameLayout;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onoratoimport com.android.systemui.R;
410c8275b392344c24bb621b2a8af360f48a6459f9Chris Wrenimport com.android.systemui.statusbar.BaseStatusBar;
42fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onoratoimport com.android.systemui.statusbar.policy.FixedSizeDrawable;
4379de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onorato
4408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandlerpublic class PhoneStatusBarView extends PanelBar {
45fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    private static final String TAG = "PhoneStatusBarView";
46198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler    private static final boolean DEBUG = PhoneStatusBar.DEBUG;
47198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
4808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    PhoneStatusBar mBar;
491c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    int mScrimColor;
505a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler    float mSettingsPanelDragzoneFrac;
515a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler    float mSettingsPanelDragzoneMin;
525a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
53b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren    boolean mFullWidthNotifications;
548e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    PanelView mFadingPanel = null;
55cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    PanelView mNotificationPanel, mSettingsPanel;
56119a4015f0f7ac1f63d596da158768f880f9fe9bJoe Onorato
57fd52b18d9bf3cd62c7a07058536e9f97db65beeaJoe Onorato    public PhoneStatusBarView(Context context, AttributeSet attrs) {
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void setBar(PhoneStatusBar bar) {
6208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mBar = bar;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
661c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    public void onAttachedToWindow() {
671c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler        Resources res = getContext().getResources();
681c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler        mScrimColor = res.getColor(R.color.notification_panel_scrim_color);
695a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        mSettingsPanelDragzoneMin = res.getDimension(R.dimen.settings_panel_dragzone_min);
70b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren        try {
715a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            mSettingsPanelDragzoneFrac = res.getFraction(R.dimen.settings_panel_dragzone_fraction, 1, 1);
725a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        } catch (NotFoundException ex) {
735a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            mSettingsPanelDragzoneFrac = 0f;
74b8ea2f59e2727020ac211d5b6f6d421314546439Chris Wren        }
755a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
765a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        mFullWidthNotifications = mSettingsPanelDragzoneFrac <= 0f;
771c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    }
781c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler
791c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler    @Override
80cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    public void addPanel(PanelView pv) {
81cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        super.addPanel(pv);
82cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        if (pv.getId() == R.id.notification_panel) {
83cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler            mNotificationPanel = pv;
84cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        } else if (pv.getId() == R.id.settings_panel){
85cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler            mSettingsPanel = pv;
86cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        }
87cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
88cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
89cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    @Override
905050813f15a1d39d49cb8eca5a3aa6df43c4d450Daniel Sandler    public boolean panelsEnabled() {
911e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler        return ((mBar.mDisabled & StatusBarManager.DISABLE_EXPAND) == 0);
921e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler    }
931e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler
941e8feef1faca7d2f14bf459691dbe724c8cf5c88Daniel Sandler    @Override
9508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
9608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        if (super.onRequestSendAccessibilityEvent(child, event)) {
9708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // The status bar is very small so augment the view that the user is touching
9808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // with the content of the status bar a whole. This way an accessibility service
9908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // may announce the current item as well as the entire content if appropriate.
10008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            AccessibilityEvent record = AccessibilityEvent.obtain();
10108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            onInitializeAccessibilityEvent(record);
10208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            dispatchPopulateAccessibilityEvent(record);
10308d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            event.appendRecord(record);
10408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            return true;
105d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn        }
10608d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return false;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
110cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    public PanelView selectPanelForTouchX(float x) {
1115a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        if (mFullWidthNotifications) {
1125a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            if (DEBUG) {
1135a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler                Slog.v(TAG, "notif frac=" + mNotificationPanel.getExpandedFraction());
1145a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            }
1155a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            return (mNotificationPanel.getExpandedFraction() == 1.0f)
1165a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler                ? mSettingsPanel : mNotificationPanel;
1175a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        }
1185a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
1195a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        // We split the status bar into thirds: the left 2/3 are for notifications, and the
120cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        // right 1/3 for quick settings. If you pull the status bar down a second time you'll
121cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        // toggle panels no matter where you pull it down.
1225a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
123cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        final float w = (float) getMeasuredWidth();
1245a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        float region = (w * mSettingsPanelDragzoneFrac);
1255a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
1265a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        if (DEBUG) {
1275a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler            Slog.v(TAG, String.format(
1285a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler                "w=%.1f frac=%.3f region=%.1f min=%.1f x=%.1f w-x=%.1f",
1295a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler                w, mSettingsPanelDragzoneFrac, region, mSettingsPanelDragzoneMin, x, (w-x)));
130cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        }
1315a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
1325a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        if (region < mSettingsPanelDragzoneMin) region = mSettingsPanelDragzoneMin;
1335a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler
1345a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        return (w - x < region) ? mSettingsPanel : mNotificationPanel;
135cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
136cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
137cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    @Override
13808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onPanelPeeked() {
13908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.onPanelPeeked();
14008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mBar.makeExpandedVisible(true);
1418e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        if (mFadingPanel == null) {
1428e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler            mFadingPanel = mTouchingPanel;
1438e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        }
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
146d49258fed489bcd72a2b2a6ce3a3c38d4b2531e6Dianne Hackborn    @Override
14708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void onAllPanelsCollapsed() {
14808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.onAllPanelsCollapsed();
14908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mBar.makeExpandedInvisible();
1508e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        mFadingPanel = null;
1518e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    }
1528e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler
1538e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    @Override
1548e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler    public void onPanelFullyOpened(PanelView openPanel) {
1558e72c9e19cfb0b6c1463fa841f1dd02be8f3b4e1Daniel Sandler        mFadingPanel = openPanel;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
16008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return mBar.interceptTouchEvent(event) || super.onTouchEvent(event);
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onInterceptTouchEvent(MotionEvent event) {
16508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        return mBar.interceptTouchEvent(event) || super.onInterceptTouchEvent(event);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1686179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov    @Override
16908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler    public void panelExpansionChanged(PanelView pv, float frac) {
17008d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        super.panelExpansionChanged(pv, frac);
17108d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
172198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        if (DEBUG) {
173198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler            Slog.v(TAG, "panelExpansionChanged: f=" + frac);
174198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler        }
175198a0306e5b0ef6b02d61e299a4b4ab4c1c2cdc8Daniel Sandler
1765a8aefa6c8ab2f129bc6477a49cd0876ec5d72faDaniel Sandler        if (mFadingPanel == pv
17798365d7663cbd82979a5700faf0050220b01084dJeff Brown                && mScrimColor != 0 && ActivityManager.isHighEndGfx()) {
17808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            // woo, special effects
17908d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            final float k = (float)(1f-0.5f*(1f-Math.cos(3.14159f * Math.pow(1f-frac, 2.2f))));
1801c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler            // attenuate background color alpha by k
1811c1edaa5f127d814058271ee4827fc0fe4a8de44Daniel Sandler            final int color = (int) ((float)(mScrimColor >>> 24) * k) << 24 | (mScrimColor & 0xFFFFFF);
18208d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler            mBar.mStatusBarWindow.setBackgroundColor(color);
1836179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov        }
18408d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
18508d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler        mBar.updateCarrierLabelVisibility(false);
1866179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov    }
18708d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
18808d05e3d1d6ade6924266296033981a96b47d5fbDaniel Sandler
1896179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov}
190