blob: 0fbdeeb4dc2c4fbd51f2b9c7ad215c5bc6ef97a4 [file] [log] [blame]
Jorim Jaggid7daab72014-05-06 22:22:20 +02001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.systemui.statusbar.phone;
18
19import android.content.Context;
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020020import android.content.Intent;
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +020021import android.graphics.Outline;
22import android.graphics.Rect;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020023import android.graphics.drawable.Drawable;
Jorim Jaggid7daab72014-05-06 22:22:20 +020024import android.util.AttributeSet;
25import android.view.View;
26import android.view.ViewGroup;
Jorim Jaggif056e352014-05-11 23:09:22 +020027import android.widget.ImageView;
Jorim Jaggid7daab72014-05-06 22:22:20 +020028import android.widget.LinearLayout;
29import android.widget.RelativeLayout;
John Spurlock7f8f22a2014-07-02 18:54:17 -040030import android.widget.Switch;
Adrian Roos59a61272014-06-06 19:07:24 +020031import android.widget.TextView;
Jorim Jaggid7daab72014-05-06 22:22:20 +020032
33import com.android.systemui.R;
John Spurlockaf8d6c42014-05-07 17:49:08 -040034import com.android.systemui.qs.QSPanel;
John Spurlock7f8f22a2014-07-02 18:54:17 -040035import com.android.systemui.qs.QSTile;
Jorim Jaggi853b0702014-07-05 04:31:14 +020036import com.android.systemui.statusbar.policy.BatteryController;
Jorim Jaggi3d878be2014-05-10 03:22:32 +020037import com.android.systemui.statusbar.policy.UserInfoController;
Jorim Jaggid7daab72014-05-06 22:22:20 +020038
39/**
40 * The view to manage the header area in the expanded status bar.
41 */
Jorim Jaggi853b0702014-07-05 04:31:14 +020042public class StatusBarHeaderView extends RelativeLayout implements View.OnClickListener,
43 BatteryController.BatteryStateChangeCallback {
Jorim Jaggif62f2bb2014-05-25 22:28:41 +020044
Jorim Jaggid7daab72014-05-06 22:22:20 +020045 private boolean mExpanded;
Jorim Jaggie65e3102014-07-01 22:00:50 +020046 private boolean mListening;
Jorim Jaggi290600a2014-05-30 17:02:20 +020047 private boolean mOverscrolled;
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020048 private boolean mKeyguardShowing;
Jorim Jaggid4aafe92014-07-10 21:00:57 +020049 private boolean mCharging;
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020050
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +020051 private ViewGroup mSystemIconsContainer;
Jorim Jaggi605f1902014-06-25 05:23:42 +020052 private View mSystemIconsSuperContainer;
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +020053 private View mDateTime;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020054 private TextView mClock;
Jorim Jaggi9054d942014-05-09 22:47:28 +020055 private View mKeyguardCarrierText;
Jorim Jaggi3d878be2014-05-10 03:22:32 +020056 private MultiUserSwitch mMultiUserSwitch;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020057 private ImageView mMultiUserAvatar;
58 private View mDateCollapsed;
59 private View mDateExpanded;
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020060 private View mStatusIcons;
61 private View mSignalCluster;
62 private View mSettingsButton;
John Spurlock7f8f22a2014-07-02 18:54:17 -040063 private View mQsDetailHeader;
Adrian Roos59a61272014-06-06 19:07:24 +020064 private View mEmergencyCallsOnly;
Jorim Jaggi853b0702014-07-05 04:31:14 +020065 private TextView mBatteryLevel;
Adrian Roos59a61272014-06-06 19:07:24 +020066
67 private boolean mShowEmergencyCallsOnly;
Adrian Roos8ddb2da2014-06-16 18:56:22 -070068 private boolean mKeyguardUserSwitcherShowing;
Jorim Jaggid7daab72014-05-06 22:22:20 +020069
70 private int mCollapsedHeight;
71 private int mExpandedHeight;
Jorim Jaggi9054d942014-05-09 22:47:28 +020072 private int mKeyguardHeight;
73
Jorim Jaggie18c2cd2014-05-08 19:16:49 +020074 private int mKeyguardWidth = ViewGroup.LayoutParams.MATCH_PARENT;
75 private int mNormalWidth;
Jorim Jaggi129e7ac2014-06-10 22:03:48 +020076 private int mPadding;
77 private int mMultiUserExpandedMargin;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020078 private int mMultiUserCollapsedMargin;
79 private int mMultiUserKeyguardMargin;
Adrian Roos8ddb2da2014-06-16 18:56:22 -070080 private int mSystemIconsSwitcherHiddenExpandedMargin;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020081 private int mClockMarginBottomExpanded;
82 private int mMultiUserSwitchWidthCollapsed;
83 private int mMultiUserSwitchWidthExpanded;
Jorim Jaggid4aafe92014-07-10 21:00:57 +020084 private int mBatteryPaddingEnd;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020085
86 /**
87 * In collapsed QS, the clock and avatar are scaled down a bit post-layout to allow for a nice
88 * transition. These values determine that factor.
89 */
90 private float mClockCollapsedScaleFactor;
91 private float mAvatarCollapsedScaleFactor;
Jorim Jaggie18c2cd2014-05-08 19:16:49 +020092
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020093 private ActivityStarter mActivityStarter;
Jorim Jaggi853b0702014-07-05 04:31:14 +020094 private BatteryController mBatteryController;
John Spurlockaf8d6c42014-05-07 17:49:08 -040095 private QSPanel mQSPanel;
Jorim Jaggid7daab72014-05-06 22:22:20 +020096
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +020097 private final Rect mClipBounds = new Rect();
98 private final Outline mOutline = new Outline();
99
Jorim Jaggid7daab72014-05-06 22:22:20 +0200100 public StatusBarHeaderView(Context context, AttributeSet attrs) {
101 super(context, attrs);
102 }
103
104 @Override
105 protected void onFinishInflate() {
106 super.onFinishInflate();
Jorim Jaggi605f1902014-06-25 05:23:42 +0200107 mSystemIconsSuperContainer = findViewById(R.id.system_icons_super_container);
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200108 mSystemIconsContainer = (ViewGroup) findViewById(R.id.system_icons_container);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200109 mSystemIconsSuperContainer.setOnClickListener(this);
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200110 mDateTime = findViewById(R.id.datetime);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200111 mClock = (TextView) findViewById(R.id.clock);
Jorim Jaggi9054d942014-05-09 22:47:28 +0200112 mKeyguardCarrierText = findViewById(R.id.keyguard_carrier_text);
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200113 mMultiUserSwitch = (MultiUserSwitch) findViewById(R.id.multi_user_switch);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200114 mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar);
115 mDateCollapsed = findViewById(R.id.date_collapsed);
116 mDateExpanded = findViewById(R.id.date_expanded);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200117 mSettingsButton = findViewById(R.id.settings_button);
118 mSettingsButton.setOnClickListener(this);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400119 mQsDetailHeader = findViewById(R.id.qs_detail_header);
120 mQsDetailHeader.setAlpha(0);
Adrian Roos59a61272014-06-06 19:07:24 +0200121 mEmergencyCallsOnly = findViewById(R.id.header_emergency_calls_only);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200122 mBatteryLevel = (TextView) findViewById(R.id.battery_level);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200123 loadDimens();
John Spurlocke86ae852014-05-17 16:18:27 -0400124 updateVisibilities();
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200125 updateClockScale();
126 updateAvatarScale();
John Spurlockd9792b72014-05-21 23:50:13 -0400127 addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
128 @Override
129 public void onLayoutChange(View v, int left, int top, int right,
130 int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
131 if ((right - left) != (oldRight - oldLeft)) {
132 // width changed, update clipping
133 setClipping(getHeight());
134 }
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200135 mClock.setPivotX(0);
136 mClock.setPivotY(mClock.getBaseline());
John Spurlockd9792b72014-05-21 23:50:13 -0400137 }
138 });
Jorim Jaggid7daab72014-05-06 22:22:20 +0200139 }
140
141 private void loadDimens() {
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200142 mCollapsedHeight = getResources().getDimensionPixelSize(R.dimen.status_bar_header_height);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200143 mExpandedHeight = getResources().getDimensionPixelSize(
144 R.dimen.status_bar_header_height_expanded);
Jorim Jaggi9054d942014-05-09 22:47:28 +0200145 mKeyguardHeight = getResources().getDimensionPixelSize(
146 R.dimen.status_bar_header_height_keyguard);
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200147 mNormalWidth = getLayoutParams().width;
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200148 mPadding = getResources().getDimensionPixelSize(R.dimen.notification_side_padding);
149 mMultiUserExpandedMargin =
150 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_expanded_margin);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200151 mMultiUserCollapsedMargin =
152 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_collapsed_margin);
153 mMultiUserKeyguardMargin =
154 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_keyguard_margin);
Adrian Roos8ddb2da2014-06-16 18:56:22 -0700155 mSystemIconsSwitcherHiddenExpandedMargin = getResources().getDimensionPixelSize(
156 R.dimen.system_icons_switcher_hidden_expanded_margin);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200157 mClockMarginBottomExpanded =
158 getResources().getDimensionPixelSize(R.dimen.clock_expanded_bottom_margin);
159 mMultiUserSwitchWidthCollapsed =
160 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_collapsed);
161 mMultiUserSwitchWidthExpanded =
162 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_expanded);
163 mAvatarCollapsedScaleFactor =
164 getResources().getDimensionPixelSize(R.dimen.multi_user_avatar_collapsed_size)
165 / (float) mMultiUserAvatar.getLayoutParams().width;
166 mClockCollapsedScaleFactor =
167 getResources().getDimensionPixelSize(R.dimen.qs_time_collapsed_size)
168 / mClock.getTextSize();
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200169 mBatteryPaddingEnd =
170 getResources().getDimensionPixelSize(R.dimen.battery_level_padding_end);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200171 }
172
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200173 public void setActivityStarter(ActivityStarter activityStarter) {
174 mActivityStarter = activityStarter;
175 }
176
Jorim Jaggi853b0702014-07-05 04:31:14 +0200177 public void setBatteryController(BatteryController batteryController) {
178 mBatteryController = batteryController;
179 }
180
Jorim Jaggid7daab72014-05-06 22:22:20 +0200181 public int getCollapsedHeight() {
Jorim Jaggi9054d942014-05-09 22:47:28 +0200182 return mKeyguardShowing ? mKeyguardHeight : mCollapsedHeight;
Jorim Jaggid7daab72014-05-06 22:22:20 +0200183 }
184
185 public int getExpandedHeight() {
186 return mExpandedHeight;
187 }
188
Jorim Jaggie65e3102014-07-01 22:00:50 +0200189 public void setListening(boolean listening) {
190 if (listening == mListening) {
191 return;
192 }
193 mListening = listening;
Jorim Jaggi853b0702014-07-05 04:31:14 +0200194 updateBatteryListening();
Jorim Jaggie65e3102014-07-01 22:00:50 +0200195 }
196
Jorim Jaggi290600a2014-05-30 17:02:20 +0200197 public void setExpanded(boolean expanded, boolean overscrolled) {
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200198 boolean changed = expanded != mExpanded;
Jorim Jaggi290600a2014-05-30 17:02:20 +0200199 boolean overscrollChanged = overscrolled != mOverscrolled;
Jorim Jaggi9054d942014-05-09 22:47:28 +0200200 mExpanded = expanded;
Jorim Jaggi290600a2014-05-30 17:02:20 +0200201 mOverscrolled = overscrolled;
202 if (changed || overscrollChanged) {
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200203 updateHeights();
204 updateVisibilities();
205 updateSystemIconsLayoutParams();
Jorim Jaggif62f2bb2014-05-25 22:28:41 +0200206 updateZTranslation();
Jorim Jaggi5d6957e2014-05-26 02:15:06 +0200207 updateClickTargets();
Adrian Roos13dee432014-06-10 19:42:47 +0200208 updateWidth();
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200209 updatePadding();
210 updateMultiUserSwitch();
John Spurlockaf8d6c42014-05-07 17:49:08 -0400211 if (mQSPanel != null) {
Jorim Jaggi290600a2014-05-30 17:02:20 +0200212 mQSPanel.setExpanded(expanded && !overscrolled);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400213 }
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200214 updateClockScale();
215 updateAvatarScale();
216 updateClockLp();
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200217 updateBatteryLevelPaddingEnd();
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200218 }
Jorim Jaggi9054d942014-05-09 22:47:28 +0200219 }
220
221 private void updateHeights() {
Jorim Jaggibc5f4962014-05-12 00:00:52 +0200222 boolean onKeyguardAndCollapsed = mKeyguardShowing && !mExpanded;
Jorim Jaggi9054d942014-05-09 22:47:28 +0200223 int height;
224 if (mExpanded) {
225 height = mExpandedHeight;
Jorim Jaggibc5f4962014-05-12 00:00:52 +0200226 } else if (onKeyguardAndCollapsed) {
Jorim Jaggi9054d942014-05-09 22:47:28 +0200227 height = mKeyguardHeight;
228 } else {
229 height = mCollapsedHeight;
230 }
231 ViewGroup.LayoutParams lp = getLayoutParams();
232 if (lp.height != height) {
233 lp.height = height;
Jorim Jaggid7daab72014-05-06 22:22:20 +0200234 setLayoutParams(lp);
Jorim Jaggi9054d942014-05-09 22:47:28 +0200235 }
Jorim Jaggibc5f4962014-05-12 00:00:52 +0200236 int systemIconsContainerHeight = onKeyguardAndCollapsed ? mKeyguardHeight : mCollapsedHeight;
Jorim Jaggi605f1902014-06-25 05:23:42 +0200237 lp = mSystemIconsSuperContainer.getLayoutParams();
Jorim Jaggi9054d942014-05-09 22:47:28 +0200238 if (lp.height != systemIconsContainerHeight) {
239 lp.height = systemIconsContainerHeight;
Jorim Jaggi605f1902014-06-25 05:23:42 +0200240 mSystemIconsSuperContainer.setLayoutParams(lp);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200241 }
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200242 lp = mMultiUserSwitch.getLayoutParams();
243 if (lp.height != systemIconsContainerHeight) {
244 lp.height = systemIconsContainerHeight;
245 mMultiUserSwitch.setLayoutParams(lp);
246 }
Jorim Jaggid7daab72014-05-06 22:22:20 +0200247 }
248
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200249 private void updateWidth() {
Adrian Roos13dee432014-06-10 19:42:47 +0200250 int width = (mKeyguardShowing && !mExpanded) ? mKeyguardWidth : mNormalWidth;
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200251 ViewGroup.LayoutParams lp = getLayoutParams();
252 if (width != lp.width) {
253 lp.width = width;
254 setLayoutParams(lp);
255 }
256 }
257
Jorim Jaggi740beb52014-05-11 18:53:19 +0200258 private void updateVisibilities() {
Jorim Jaggibc5f4962014-05-12 00:00:52 +0200259 boolean onKeyguardAndCollapsed = mKeyguardShowing && !mExpanded;
Jorim Jaggi853b0702014-07-05 04:31:14 +0200260 if (onKeyguardAndCollapsed) {
261 setBackground(null);
262 } else {
263 setBackgroundResource(R.drawable.notification_header_bg);
264 }
Jorim Jaggibc5f4962014-05-12 00:00:52 +0200265 mDateTime.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE);
266 mKeyguardCarrierText.setVisibility(onKeyguardAndCollapsed ? View.VISIBLE : View.GONE);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200267 mDateCollapsed.setVisibility(mExpanded && !mOverscrolled ? View.GONE : View.VISIBLE);
268 mDateExpanded.setVisibility(mExpanded && !mOverscrolled ? View.VISIBLE : View.GONE);
Jorim Jaggi290600a2014-05-30 17:02:20 +0200269 mSettingsButton.setVisibility(mExpanded && !mOverscrolled ? View.VISIBLE : View.GONE);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400270 mQsDetailHeader.setVisibility(mExpanded ? View.VISIBLE : View.GONE);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200271 if (mStatusIcons != null) {
Jorim Jaggi290600a2014-05-30 17:02:20 +0200272 mStatusIcons.setVisibility(!mExpanded || mOverscrolled ? View.VISIBLE : View.GONE);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200273 }
274 if (mSignalCluster != null) {
Jorim Jaggi290600a2014-05-30 17:02:20 +0200275 mSignalCluster.setVisibility(!mExpanded || mOverscrolled ? View.VISIBLE : View.GONE);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200276 }
Adrian Roos59a61272014-06-06 19:07:24 +0200277 mEmergencyCallsOnly.setVisibility(mExpanded && !mOverscrolled && mShowEmergencyCallsOnly
278 ? VISIBLE : GONE);
Adrian Roos8ddb2da2014-06-16 18:56:22 -0700279 mMultiUserSwitch.setVisibility(mExpanded || !mKeyguardUserSwitcherShowing
280 ? VISIBLE : GONE);
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200281 mBatteryLevel.setVisibility(mKeyguardShowing && mCharging || mExpanded && !mOverscrolled
282 ? View.VISIBLE : View.GONE);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200283 }
284
285 private void updateSystemIconsLayoutParams() {
Jorim Jaggi605f1902014-06-25 05:23:42 +0200286 RelativeLayout.LayoutParams lp = (LayoutParams) mSystemIconsSuperContainer.getLayoutParams();
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200287 lp.addRule(RelativeLayout.START_OF, mExpanded && !mOverscrolled
Jorim Jaggi853b0702014-07-05 04:31:14 +0200288 ? mSettingsButton.getId()
289 : mMultiUserSwitch.getId());
290 lp.removeRule(ALIGN_PARENT_START);
291 if (mMultiUserSwitch.getVisibility() == GONE) {
292 lp.setMarginEnd(mSystemIconsSwitcherHiddenExpandedMargin);
Adrian Roos59a61272014-06-06 19:07:24 +0200293 } else {
Jorim Jaggi853b0702014-07-05 04:31:14 +0200294 lp.setMarginEnd(0);
Adrian Roos59a61272014-06-06 19:07:24 +0200295 }
Jorim Jaggi605f1902014-06-25 05:23:42 +0200296 mSystemIconsSuperContainer.setLayoutParams(lp);
Jorim Jaggi740beb52014-05-11 18:53:19 +0200297 }
298
Jorim Jaggi853b0702014-07-05 04:31:14 +0200299 private void updateBatteryListening() {
300 if (mListening) {
301 mBatteryController.addStateChangedCallback(this);
302 } else {
303 mBatteryController.removeStateChangedCallback(this);
304 }
305 }
306
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200307 private void updateAvatarScale() {
308 if (!mExpanded || mOverscrolled) {
309 mMultiUserSwitch.setScaleX(mAvatarCollapsedScaleFactor);
310 mMultiUserSwitch.setScaleY(mAvatarCollapsedScaleFactor);
311 } else {
312 mMultiUserSwitch.setScaleX(1f);
313 mMultiUserSwitch.setScaleY(1f);
314 }
315 }
316
317 private void updateClockScale() {
318 if (!mExpanded || mOverscrolled) {
319 mClock.setScaleX(mClockCollapsedScaleFactor);
320 mClock.setScaleY(mClockCollapsedScaleFactor);
321 } else {
322 mClock.setScaleX(1f);
323 mClock.setScaleY(1f);
324 }
325 }
326
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200327 private void updateBatteryLevelPaddingEnd() {
328 mBatteryLevel.setPaddingRelative(0, 0,
329 mKeyguardShowing && !mExpanded ? 0 : mBatteryPaddingEnd, 0);
330 }
331
Jorim Jaggi853b0702014-07-05 04:31:14 +0200332 @Override
333 public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
334 mBatteryLevel.setText(getResources().getString(R.string.battery_level_template, level));
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200335 boolean changed = mCharging != charging;
336 mCharging = charging;
337 if (changed) {
338 updateVisibilities();
339 }
Jorim Jaggi853b0702014-07-05 04:31:14 +0200340 }
341
Jorim Jaggi5d6957e2014-05-26 02:15:06 +0200342 private void updateClickTargets() {
Jorim Jaggi853b0702014-07-05 04:31:14 +0200343 setClickable(!mKeyguardShowing || mExpanded);
Jorim Jaggi5d6957e2014-05-26 02:15:06 +0200344 mDateTime.setClickable(mExpanded);
345 mMultiUserSwitch.setClickable(mExpanded);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200346 mSystemIconsSuperContainer.setClickable(mExpanded);
Jorim Jaggi5d6957e2014-05-26 02:15:06 +0200347 }
348
Jorim Jaggif62f2bb2014-05-25 22:28:41 +0200349 private void updateZTranslation() {
350
351 // If we are on the Keyguard, we need to set our z position to zero, so we don't get
352 // shadows.
353 if (mKeyguardShowing && !mExpanded) {
354 setZ(0);
355 } else {
356 setTranslationZ(0);
357 }
358 }
359
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200360 private void updatePadding() {
361 boolean padded = !mKeyguardShowing || mExpanded;
362 int padding = padded ? mPadding : 0;
363 setPaddingRelative(padding, 0, padding, 0);
364 }
365
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200366 private void updateClockLp() {
367 int marginBottom = mExpanded && !mOverscrolled ? mClockMarginBottomExpanded : 0;
368 LayoutParams lp = (LayoutParams) mDateTime.getLayoutParams();
369 int rule = mExpanded && !mOverscrolled ? TRUE : 0;
370 if (marginBottom != lp.bottomMargin
371 || lp.getRules()[RelativeLayout.ALIGN_PARENT_BOTTOM] != rule) {
372 lp.bottomMargin = marginBottom;
373 lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, rule);
374 mDateTime.setLayoutParams(lp);
375 }
376 }
377
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200378 private void updateMultiUserSwitch() {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200379 int marginEnd;
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200380 if (mExpanded && !mOverscrolled) {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200381 marginEnd = mMultiUserExpandedMargin;
382 } else if (mKeyguardShowing) {
383 marginEnd = mMultiUserKeyguardMargin;
384 } else {
385 marginEnd = mMultiUserCollapsedMargin;
386 }
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200387 int width = mExpanded && !mOverscrolled
388 ? mMultiUserSwitchWidthExpanded
389 : mMultiUserSwitchWidthCollapsed;
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200390 MarginLayoutParams lp = (MarginLayoutParams) mMultiUserSwitch.getLayoutParams();
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200391 if (marginEnd != lp.getMarginEnd() || lp.width != width) {
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200392 lp.setMarginEnd(marginEnd);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200393 lp.width = width;
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200394 mMultiUserSwitch.setLayoutParams(lp);
395 }
396 }
397
Jorim Jaggi54045422014-07-03 18:30:40 +0200398 public void setExpansion(float t) {
399 float height = mCollapsedHeight + t * (mExpandedHeight - mCollapsedHeight);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200400 if (height < mCollapsedHeight) {
401 height = mCollapsedHeight;
402 }
403 if (height > mExpandedHeight) {
404 height = mExpandedHeight;
405 }
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +0200406 setClipping(height);
407 }
408
409 private void setClipping(float height) {
410 mClipBounds.set(getPaddingLeft(), 0, getWidth() - getPaddingRight(), (int) height);
411 setClipBounds(mClipBounds);
412 mOutline.setRect(mClipBounds);
413 setOutline(mOutline);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200414 }
415
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200416 public void attachSystemIcons(LinearLayout systemIcons) {
417 mSystemIconsContainer.addView(systemIcons);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200418 mStatusIcons = systemIcons.findViewById(R.id.statusIcons);
419 mSignalCluster = systemIcons.findViewById(R.id.signal_cluster);
420 }
421
422 public void onSystemIconsDetached() {
423 if (mStatusIcons != null) {
424 mStatusIcons.setVisibility(View.VISIBLE);
425 }
426 if (mSignalCluster != null) {
427 mSignalCluster.setVisibility(View.VISIBLE);
428 }
429 mStatusIcons = null;
430 mSignalCluster = null;
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200431 }
432
433 public void setKeyguardShowing(boolean keyguardShowing) {
Jorim Jaggi9054d942014-05-09 22:47:28 +0200434 mKeyguardShowing = keyguardShowing;
Jorim Jaggi9054d942014-05-09 22:47:28 +0200435 updateHeights();
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200436 updateWidth();
Jorim Jaggi740beb52014-05-11 18:53:19 +0200437 updateVisibilities();
Jorim Jaggif62f2bb2014-05-25 22:28:41 +0200438 updateZTranslation();
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200439 updatePadding();
440 updateMultiUserSwitch();
Jorim Jaggi853b0702014-07-05 04:31:14 +0200441 updateClickTargets();
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200442 updateBatteryLevelPaddingEnd();
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200443 }
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200444
445 public void setUserInfoController(UserInfoController userInfoController) {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200446 userInfoController.addListener(new UserInfoController.OnUserInfoChangedListener() {
447 @Override
448 public void onUserInfoChanged(String name, Drawable picture) {
449 mMultiUserAvatar.setImageDrawable(picture);
450 }
451 });
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200452 }
453
454 public void setOverlayParent(ViewGroup parent) {
455 mMultiUserSwitch.setOverlayParent(parent);
456 }
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200457
458 @Override
459 public void onClick(View v) {
460 if (v == mSettingsButton) {
461 startSettingsActivity();
Jorim Jaggi853b0702014-07-05 04:31:14 +0200462 } else if (v == mSystemIconsSuperContainer) {
463 startBatteryActivity();
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200464 }
465 }
466
467 private void startSettingsActivity() {
468 mActivityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
469 }
John Spurlockaf8d6c42014-05-07 17:49:08 -0400470
Jorim Jaggi853b0702014-07-05 04:31:14 +0200471 private void startBatteryActivity() {
472 mActivityStarter.startActivity(new Intent(Intent.ACTION_POWER_USAGE_SUMMARY));
473 }
474
John Spurlockaf8d6c42014-05-07 17:49:08 -0400475 public void setQSPanel(QSPanel qsp) {
476 mQSPanel = qsp;
John Spurlock3e04cc82014-05-30 12:34:03 -0400477 if (mQSPanel != null) {
478 mQSPanel.setCallback(mQsPanelCallback);
479 }
John Spurlockaf8d6c42014-05-07 17:49:08 -0400480 }
John Spurlock3e04cc82014-05-30 12:34:03 -0400481
Selim Cinekc0ce82d2014-06-10 13:21:15 +0200482 @Override
483 public boolean shouldDelayChildPressedState() {
484 return true;
485 }
Selim Cinek45f904a2014-06-11 11:42:53 +0200486
Adrian Roos59a61272014-06-06 19:07:24 +0200487 public void setShowEmergencyCallsOnly(boolean show) {
488 mShowEmergencyCallsOnly = show;
489 if (mExpanded) {
490 updateVisibilities();
Adrian Roos59a61272014-06-06 19:07:24 +0200491 }
492 }
493
Adrian Roos8ddb2da2014-06-16 18:56:22 -0700494 public void setKeyguardUserSwitcherShowing(boolean showing) {
495 // STOPSHIP: NOT CALLED PROPERLY WHEN GOING TO FULL SHADE AND RETURNING!?!
496 mKeyguardUserSwitcherShowing = showing;
497 updateVisibilities();
498 updateSystemIconsLayoutParams();
499 }
Jorim Jaggi2580a9762014-06-25 03:08:25 +0200500
501 @Override
502 public boolean hasOverlappingRendering() {
503 return !mKeyguardShowing || mExpanded;
504 }
John Spurlock7f8f22a2014-07-02 18:54:17 -0400505
Jorim Jaggi266f6772014-07-10 19:13:17 +0200506 @Override
507 protected void dispatchSetPressed(boolean pressed) {
508 // We don't want that everything lights up when we click on the header, so block the request
509 // here.
510 }
511
John Spurlock7f8f22a2014-07-02 18:54:17 -0400512 private final QSPanel.Callback mQsPanelCallback = new QSPanel.Callback() {
513 @Override
514 public void onToggleStateChanged(final boolean state) {
515 post(new Runnable() {
516 @Override
517 public void run() {
518 handleToggleStateChanged(state);
519 }
520 });
521 }
522
523 @Override
524 public void onShowingDetail(final QSTile.DetailAdapter detail) {
525 post(new Runnable() {
526 @Override
527 public void run() {
528 handleShowingDetail(detail);
529 }
530 });
531 }
532
533 private void handleToggleStateChanged(boolean state) {
534 final Switch headerSwitch = (Switch)
535 mQsDetailHeader.findViewById(android.R.id.toggle);
536 headerSwitch.setChecked(state);
537 }
538
539 private void handleShowingDetail(final QSTile.DetailAdapter detail) {
540 final boolean showingDetail = detail != null;
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200541 transition(mDateTime, !showingDetail);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400542 transition(mQsDetailHeader, showingDetail);
543 if (showingDetail) {
544 final TextView headerTitle = (TextView)
545 mQsDetailHeader.findViewById(android.R.id.title);
546 headerTitle.setText(detail.getTitle());
547 final Switch headerSwitch = (Switch)
548 mQsDetailHeader.findViewById(android.R.id.toggle);
549 final Boolean toggleState = detail.getToggleState();
550 if (toggleState == null) {
551 headerSwitch.setVisibility(INVISIBLE);
552 mQsDetailHeader.setClickable(false);
553 } else {
554 headerSwitch.setVisibility(VISIBLE);
555 headerSwitch.setChecked(toggleState);
556 mQsDetailHeader.setClickable(true);
557 mQsDetailHeader.setOnClickListener(new OnClickListener() {
558 @Override
559 public void onClick(View v) {
560 detail.setToggleState(!toggleState);
561 }
562 });
563 }
564 } else {
565 mQsDetailHeader.setClickable(false);
566 }
567 }
568
569 private void transition(final View v, final boolean in) {
570 if (in) {
571 v.bringToFront();
572 }
573 v.animate().alpha(in ? 1 : 0).withLayer().start();
574 }
575 };
Jorim Jaggid7daab72014-05-06 22:22:20 +0200576}