1cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler/*
2cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler * Copyright (C) 2012 The Android Open Source Project
3cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler *
4cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
5cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler * you may not use this file except in compliance with the License.
6cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler * You may obtain a copy of the License at
7cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler *
8cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
9cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler *
10cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler * Unless required by applicable law or agreed to in writing, software
11cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
12cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler * See the License for the specific language governing permissions and
14cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler * limitations under the License.
15cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler */
16cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
17cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandlerpackage com.android.systemui.statusbar.phone;
18cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
19d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport android.animation.LayoutTransition;
20cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandlerimport android.content.Context;
21d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport android.content.Intent;
22d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport android.content.res.Resources;
2313522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandlerimport android.graphics.Canvas;
2413522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandlerimport android.graphics.drawable.Drawable;
25cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandlerimport android.util.AttributeSet;
26d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport android.view.LayoutInflater;
27d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport android.view.View;
28d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport android.view.ViewGroup;
29d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
30d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport com.android.systemui.R;
31d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport com.android.systemui.statusbar.BaseStatusBar;
32151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandlerimport com.android.systemui.statusbar.GestureRecorder;
33d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport com.android.systemui.statusbar.policy.BatteryController;
34d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport com.android.systemui.statusbar.policy.BluetoothController;
35d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport com.android.systemui.statusbar.policy.LocationController;
36d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chungimport com.android.systemui.statusbar.policy.NetworkController;
37cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
38cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandlerpublic class SettingsPanelView extends PanelView {
39d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
40d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    private QuickSettings mQS;
41d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    private QuickSettingsContainerView mQSContainer;
42d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
4313522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler    Drawable mHandleBar;
4413522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler    float mHandleBarHeight;
4513522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler    View mHandleView;
4613522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler
47cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    public SettingsPanelView(Context context, AttributeSet attrs) {
48cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        super(context, attrs);
49cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
50cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler
51cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    @Override
52d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    protected void onFinishInflate() {
53d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        super.onFinishInflate();
54d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
55d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        mQSContainer = (QuickSettingsContainerView) findViewById(R.id.quick_settings_container);
5613522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler
5713522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        Resources resources = getContext().getResources();
5813522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        mHandleBar = resources.getDrawable(R.drawable.status_bar_close);
5913522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        mHandleBarHeight = resources.getDimension(R.dimen.close_handle_height);
6013522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        mHandleView = findViewById(R.id.handle);
61bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt
62bac221ff0b9e1406f95f23c9a5c3b580ece10eabCasey Burkhardt        setContentDescription(resources.getString(R.string.accessibility_desc_quick_settings));
63d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    }
64101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler
65101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    public void setQuickSettings(QuickSettings qs) {
66101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler        mQS = qs;
67101784e5605338f22e32f587ffcaa09b582d556cDaniel Sandler    }
68d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
69d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    @Override
70d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    public void setBar(PanelBar panelBar) {
71d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        super.setBar(panelBar);
72d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
73d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        if (mQS != null) {
74d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung            mQS.setBar(panelBar);
75d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        }
76d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    }
77d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
7843229d707515ce51c52f63e15257960c6d29162cWinson Chung    public void setImeWindowStatus(boolean visible) {
7943229d707515ce51c52f63e15257960c6d29162cWinson Chung        if (mQS != null) {
8043229d707515ce51c52f63e15257960c6d29162cWinson Chung            mQS.setImeWindowStatus(visible);
8143229d707515ce51c52f63e15257960c6d29162cWinson Chung        }
8243229d707515ce51c52f63e15257960c6d29162cWinson Chung    }
8343229d707515ce51c52f63e15257960c6d29162cWinson Chung
84d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    public void setup(NetworkController networkController, BluetoothController bluetoothController,
85d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung            BatteryController batteryController, LocationController locationController) {
86d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        if (mQS != null) {
87d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung            mQS.setup(networkController, bluetoothController, batteryController,
88d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung                    locationController);
89d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        }
90d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    }
91d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
92d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    void updateResources() {
93d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        if (mQS != null) {
94d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung            mQS.updateResources();
95d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        }
96d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        if (mQSContainer != null) {
97d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung            mQSContainer.updateResources();
98d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        }
99d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung        requestLayout();
100d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    }
101d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung
102d63c59786509aadd6a8d0c5cb45ed696339f16b7Winson Chung    @Override
103cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    public void fling(float vel, boolean always) {
104151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        GestureRecorder gr = ((PhoneStatusBarView) mBar).mBar.getGestureRecorder();
105151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        if (gr != null) {
106151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler            gr.tag(
107151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler                "fling " + ((vel > 0) ? "open" : "closed"),
108151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler                "settings,v=" + vel);
109151f00d8f06e207038125f227b42f06a25d5e0a0Daniel Sandler        }
110cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler        super.fling(vel, always);
111cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler    }
1123ffdcc70c28d7a2abbb4f248d32d70d45d61fd44Daniel Sandler
1133ffdcc70c28d7a2abbb4f248d32d70d45d61fd44Daniel Sandler    public void setService(PhoneStatusBar phoneStatusBar) {
1143ffdcc70c28d7a2abbb4f248d32d70d45d61fd44Daniel Sandler        if (mQS != null) {
1153ffdcc70c28d7a2abbb4f248d32d70d45d61fd44Daniel Sandler            mQS.setService(phoneStatusBar);
1163ffdcc70c28d7a2abbb4f248d32d70d45d61fd44Daniel Sandler        }
1173ffdcc70c28d7a2abbb4f248d32d70d45d61fd44Daniel Sandler    }
11813522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler
11913522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler    // We draw the handle ourselves so that it's always glued to the bottom of the window.
12013522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler    @Override
12113522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
12213522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        super.onLayout(changed, left, top, right, bottom);
12313522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        if (changed) {
12413522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler            final int pl = getPaddingLeft();
12513522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler            final int pr = getPaddingRight();
12613522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler            mHandleBar.setBounds(pl, 0, getWidth() - pr, (int) mHandleBarHeight);
12713522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        }
12813522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler    }
12913522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler
13013522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler    @Override
13113522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler    public void draw(Canvas canvas) {
13213522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        super.draw(canvas);
13313522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        final int off = (int) (getHeight() - mHandleBarHeight - getPaddingBottom());
13413522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        canvas.translate(0, off);
13513522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        mHandleBar.setState(mHandleView.getDrawableState());
13613522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        mHandleBar.draw(canvas);
13713522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler        canvas.translate(0, -off);
13813522a2e40730a0703fd7f185b7fb9be8ae37ab6Daniel Sandler    }
139cf591db04914d8ceadd982451b325bd8c4817086Daniel Sandler}
140