blob: 7b40d72c2ed3f597eee5d492ffcc356e5671323c [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
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020019import android.app.AlarmClockInfo;
20import android.app.PendingIntent;
Jorim Jaggid7daab72014-05-06 22:22:20 +020021import android.content.Context;
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020022import android.content.Intent;
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +020023import android.graphics.Outline;
24import android.graphics.Rect;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020025import android.graphics.drawable.Drawable;
Jorim Jaggid7daab72014-05-06 22:22:20 +020026import android.util.AttributeSet;
27import android.view.View;
28import android.view.ViewGroup;
Chris Craik7b7ca3c2014-07-11 13:32:19 -070029import android.view.ViewOutlineProvider;
Jorim Jaggif056e352014-05-11 23:09:22 +020030import android.widget.ImageView;
Jorim Jaggid7daab72014-05-06 22:22:20 +020031import android.widget.LinearLayout;
32import android.widget.RelativeLayout;
John Spurlock7f8f22a2014-07-02 18:54:17 -040033import android.widget.Switch;
Adrian Roos59a61272014-06-06 19:07:24 +020034import android.widget.TextView;
Jorim Jaggid7daab72014-05-06 22:22:20 +020035
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020036import com.android.keyguard.KeyguardStatusView;
Jorim Jaggid7daab72014-05-06 22:22:20 +020037import com.android.systemui.R;
John Spurlockaf8d6c42014-05-07 17:49:08 -040038import com.android.systemui.qs.QSPanel;
John Spurlock7f8f22a2014-07-02 18:54:17 -040039import com.android.systemui.qs.QSTile;
Jorim Jaggi853b0702014-07-05 04:31:14 +020040import com.android.systemui.statusbar.policy.BatteryController;
Adrian Roos723632e2014-07-23 21:13:21 +020041import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020042import com.android.systemui.statusbar.policy.NextAlarmController;
Jorim Jaggi3d878be2014-05-10 03:22:32 +020043import com.android.systemui.statusbar.policy.UserInfoController;
Jorim Jaggid7daab72014-05-06 22:22:20 +020044
45/**
46 * The view to manage the header area in the expanded status bar.
47 */
Jorim Jaggi853b0702014-07-05 04:31:14 +020048public class StatusBarHeaderView extends RelativeLayout implements View.OnClickListener,
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020049 BatteryController.BatteryStateChangeCallback, NextAlarmController.NextAlarmChangeCallback {
Jorim Jaggif62f2bb2014-05-25 22:28:41 +020050
Jorim Jaggid7daab72014-05-06 22:22:20 +020051 private boolean mExpanded;
Jorim Jaggie65e3102014-07-01 22:00:50 +020052 private boolean mListening;
Jorim Jaggi290600a2014-05-30 17:02:20 +020053 private boolean mOverscrolled;
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020054 private boolean mKeyguardShowing;
Jorim Jaggid4aafe92014-07-10 21:00:57 +020055 private boolean mCharging;
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020056
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +020057 private ViewGroup mSystemIconsContainer;
Jorim Jaggi605f1902014-06-25 05:23:42 +020058 private View mSystemIconsSuperContainer;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020059 private View mDateGroup;
60 private View mClock;
Jorim Jaggi329fa242014-07-11 21:42:00 +020061 private View mTime;
62 private View mAmPm;
Jorim Jaggi9054d942014-05-09 22:47:28 +020063 private View mKeyguardCarrierText;
Jorim Jaggi3d878be2014-05-10 03:22:32 +020064 private MultiUserSwitch mMultiUserSwitch;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020065 private ImageView mMultiUserAvatar;
66 private View mDateCollapsed;
67 private View mDateExpanded;
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020068 private View mStatusIcons;
69 private View mSignalCluster;
70 private View mSettingsButton;
John Spurlock7f8f22a2014-07-02 18:54:17 -040071 private View mQsDetailHeader;
John Spurlock486b78e2014-07-07 08:37:56 -040072 private TextView mQsDetailHeaderTitle;
73 private Switch mQsDetailHeaderSwitch;
Adrian Roos59a61272014-06-06 19:07:24 +020074 private View mEmergencyCallsOnly;
Jorim Jaggi853b0702014-07-05 04:31:14 +020075 private TextView mBatteryLevel;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020076 private TextView mAlarmStatus;
Adrian Roos59a61272014-06-06 19:07:24 +020077
78 private boolean mShowEmergencyCallsOnly;
Adrian Roos8ddb2da2014-06-16 18:56:22 -070079 private boolean mKeyguardUserSwitcherShowing;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020080 private boolean mAlarmShowing;
81 private AlarmClockInfo mNextAlarm;
Jorim Jaggid7daab72014-05-06 22:22:20 +020082
83 private int mCollapsedHeight;
84 private int mExpandedHeight;
Jorim Jaggi9054d942014-05-09 22:47:28 +020085 private int mKeyguardHeight;
86
Jorim Jaggie18c2cd2014-05-08 19:16:49 +020087 private int mKeyguardWidth = ViewGroup.LayoutParams.MATCH_PARENT;
88 private int mNormalWidth;
Jorim Jaggi129e7ac2014-06-10 22:03:48 +020089 private int mPadding;
90 private int mMultiUserExpandedMargin;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020091 private int mMultiUserCollapsedMargin;
92 private int mMultiUserKeyguardMargin;
Adrian Roos8ddb2da2014-06-16 18:56:22 -070093 private int mSystemIconsSwitcherHiddenExpandedMargin;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020094 private int mClockMarginBottomExpanded;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020095 private int mClockMarginBottomCollapsed;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020096 private int mMultiUserSwitchWidthCollapsed;
97 private int mMultiUserSwitchWidthExpanded;
Jorim Jaggi87d84d42014-07-28 12:14:48 +020098 private int mMultiUserSwitchWidthKeyguard;
Jorim Jaggid4aafe92014-07-10 21:00:57 +020099 private int mBatteryPaddingEnd;
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200100 private int mBatteryMarginExpanded;
101 private int mBatteryMarginKeyguard;
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200102
103 /**
104 * In collapsed QS, the clock and avatar are scaled down a bit post-layout to allow for a nice
105 * transition. These values determine that factor.
106 */
107 private float mClockCollapsedScaleFactor;
108 private float mAvatarCollapsedScaleFactor;
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200109 private float mAvatarKeyguardScaleFactor;
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200110
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200111 private ActivityStarter mActivityStarter;
Jorim Jaggi853b0702014-07-05 04:31:14 +0200112 private BatteryController mBatteryController;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200113 private NextAlarmController mNextAlarmController;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400114 private QSPanel mQSPanel;
Jorim Jaggibc976e32014-07-25 16:42:34 +0200115 private KeyguardUserSwitcher mKeyguardUserSwitcher;
Jorim Jaggid7daab72014-05-06 22:22:20 +0200116
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +0200117 private final Rect mClipBounds = new Rect();
John Spurlock312b7922014-07-22 22:23:42 -0400118 private final StatusIconClipper mStatusIconClipper = new StatusIconClipper();
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +0200119
Jorim Jaggid7daab72014-05-06 22:22:20 +0200120 public StatusBarHeaderView(Context context, AttributeSet attrs) {
121 super(context, attrs);
122 }
123
124 @Override
125 protected void onFinishInflate() {
126 super.onFinishInflate();
Jorim Jaggi605f1902014-06-25 05:23:42 +0200127 mSystemIconsSuperContainer = findViewById(R.id.system_icons_super_container);
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200128 mSystemIconsContainer = (ViewGroup) findViewById(R.id.system_icons_container);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200129 mSystemIconsSuperContainer.setOnClickListener(this);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200130 mDateGroup = findViewById(R.id.date_group);
131 mClock = findViewById(R.id.clock);
Jorim Jaggi329fa242014-07-11 21:42:00 +0200132 mTime = findViewById(R.id.time_view);
133 mAmPm = findViewById(R.id.am_pm_view);
Jorim Jaggi9054d942014-05-09 22:47:28 +0200134 mKeyguardCarrierText = findViewById(R.id.keyguard_carrier_text);
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200135 mMultiUserSwitch = (MultiUserSwitch) findViewById(R.id.multi_user_switch);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200136 mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar);
137 mDateCollapsed = findViewById(R.id.date_collapsed);
138 mDateExpanded = findViewById(R.id.date_expanded);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200139 mSettingsButton = findViewById(R.id.settings_button);
140 mSettingsButton.setOnClickListener(this);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400141 mQsDetailHeader = findViewById(R.id.qs_detail_header);
142 mQsDetailHeader.setAlpha(0);
John Spurlock486b78e2014-07-07 08:37:56 -0400143 mQsDetailHeaderTitle = (TextView) mQsDetailHeader.findViewById(android.R.id.title);
144 mQsDetailHeaderSwitch = (Switch) mQsDetailHeader.findViewById(android.R.id.toggle);
Adrian Roos59a61272014-06-06 19:07:24 +0200145 mEmergencyCallsOnly = findViewById(R.id.header_emergency_calls_only);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200146 mBatteryLevel = (TextView) findViewById(R.id.battery_level);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200147 mAlarmStatus = (TextView) findViewById(R.id.alarm_status);
148 mAlarmStatus.setOnClickListener(this);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200149 loadDimens();
John Spurlocke86ae852014-05-17 16:18:27 -0400150 updateVisibilities();
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200151 updateClockScale();
152 updateAvatarScale();
John Spurlockd9792b72014-05-21 23:50:13 -0400153 addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
154 @Override
155 public void onLayoutChange(View v, int left, int top, int right,
156 int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
157 if ((right - left) != (oldRight - oldLeft)) {
158 // width changed, update clipping
159 setClipping(getHeight());
160 }
Jorim Jaggi329fa242014-07-11 21:42:00 +0200161 boolean rtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
162 mTime.setPivotX(rtl ? mTime.getWidth() : 0);
163 mTime.setPivotY(mTime.getBaseline());
164 mAmPm.setPivotX(rtl ? mAmPm.getWidth() : 0);
165 mAmPm.setPivotY(mAmPm.getBaseline());
166 updateAmPmTranslation();
John Spurlockd9792b72014-05-21 23:50:13 -0400167 }
168 });
Chris Craik7b7ca3c2014-07-11 13:32:19 -0700169 setOutlineProvider(new ViewOutlineProvider() {
170 @Override
Chris Craik31ba1922014-07-18 13:48:09 -0700171 public void getOutline(View view, Outline outline) {
Chris Craik7b7ca3c2014-07-11 13:32:19 -0700172 outline.setRect(mClipBounds);
Chris Craik7b7ca3c2014-07-11 13:32:19 -0700173 }
174 });
Jorim Jaggid7daab72014-05-06 22:22:20 +0200175 }
176
177 private void loadDimens() {
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200178 mCollapsedHeight = getResources().getDimensionPixelSize(R.dimen.status_bar_header_height);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200179 mExpandedHeight = getResources().getDimensionPixelSize(
180 R.dimen.status_bar_header_height_expanded);
Jorim Jaggi9054d942014-05-09 22:47:28 +0200181 mKeyguardHeight = getResources().getDimensionPixelSize(
182 R.dimen.status_bar_header_height_keyguard);
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200183 mNormalWidth = getLayoutParams().width;
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200184 mPadding = getResources().getDimensionPixelSize(R.dimen.notification_side_padding);
185 mMultiUserExpandedMargin =
186 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_expanded_margin);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200187 mMultiUserCollapsedMargin =
188 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_collapsed_margin);
189 mMultiUserKeyguardMargin =
190 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_keyguard_margin);
Adrian Roos8ddb2da2014-06-16 18:56:22 -0700191 mSystemIconsSwitcherHiddenExpandedMargin = getResources().getDimensionPixelSize(
192 R.dimen.system_icons_switcher_hidden_expanded_margin);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200193 mClockMarginBottomExpanded =
194 getResources().getDimensionPixelSize(R.dimen.clock_expanded_bottom_margin);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200195 mClockMarginBottomCollapsed =
196 getResources().getDimensionPixelSize(R.dimen.clock_collapsed_bottom_margin);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200197 mMultiUserSwitchWidthCollapsed =
198 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_collapsed);
199 mMultiUserSwitchWidthExpanded =
200 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_expanded);
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200201 mMultiUserSwitchWidthKeyguard =
202 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_keyguard);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200203 mAvatarCollapsedScaleFactor =
204 getResources().getDimensionPixelSize(R.dimen.multi_user_avatar_collapsed_size)
205 / (float) mMultiUserAvatar.getLayoutParams().width;
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200206 mAvatarKeyguardScaleFactor =
207 getResources().getDimensionPixelSize(R.dimen.multi_user_avatar_keyguard_size)
208 / (float) mMultiUserAvatar.getLayoutParams().width;
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200209 mClockCollapsedScaleFactor =
Jorim Jaggi329fa242014-07-11 21:42:00 +0200210 (float) getResources().getDimensionPixelSize(R.dimen.qs_time_collapsed_size)
211 / (float) getResources().getDimensionPixelSize(R.dimen.qs_time_expanded_size);
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200212 mBatteryPaddingEnd =
213 getResources().getDimensionPixelSize(R.dimen.battery_level_padding_end);
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200214 mBatteryMarginExpanded =
215 getResources().getDimensionPixelSize(R.dimen.header_battery_margin_expanded);
216 mBatteryMarginKeyguard =
217 getResources().getDimensionPixelSize(R.dimen.header_battery_margin_keyguard);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200218 }
219
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200220 public void setActivityStarter(ActivityStarter activityStarter) {
221 mActivityStarter = activityStarter;
222 }
223
Jorim Jaggi853b0702014-07-05 04:31:14 +0200224 public void setBatteryController(BatteryController batteryController) {
225 mBatteryController = batteryController;
226 }
227
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200228 public void setNextAlarmController(NextAlarmController nextAlarmController) {
229 mNextAlarmController = nextAlarmController;
230 }
231
Jorim Jaggid7daab72014-05-06 22:22:20 +0200232 public int getCollapsedHeight() {
Jorim Jaggi9054d942014-05-09 22:47:28 +0200233 return mKeyguardShowing ? mKeyguardHeight : mCollapsedHeight;
Jorim Jaggid7daab72014-05-06 22:22:20 +0200234 }
235
236 public int getExpandedHeight() {
237 return mExpandedHeight;
238 }
239
Jorim Jaggie65e3102014-07-01 22:00:50 +0200240 public void setListening(boolean listening) {
241 if (listening == mListening) {
242 return;
243 }
244 mListening = listening;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200245 updateListeners();
Jorim Jaggie65e3102014-07-01 22:00:50 +0200246 }
247
Jorim Jaggi290600a2014-05-30 17:02:20 +0200248 public void setExpanded(boolean expanded, boolean overscrolled) {
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200249 boolean changed = expanded != mExpanded;
Jorim Jaggi290600a2014-05-30 17:02:20 +0200250 boolean overscrollChanged = overscrolled != mOverscrolled;
Jorim Jaggi9054d942014-05-09 22:47:28 +0200251 mExpanded = expanded;
Jorim Jaggi290600a2014-05-30 17:02:20 +0200252 mOverscrolled = overscrolled;
253 if (changed || overscrollChanged) {
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200254 updateHeights();
255 updateVisibilities();
256 updateSystemIconsLayoutParams();
Jorim Jaggif62f2bb2014-05-25 22:28:41 +0200257 updateZTranslation();
Jorim Jaggi5d6957e2014-05-26 02:15:06 +0200258 updateClickTargets();
Adrian Roos13dee432014-06-10 19:42:47 +0200259 updateWidth();
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200260 updatePadding();
261 updateMultiUserSwitch();
John Spurlockaf8d6c42014-05-07 17:49:08 -0400262 if (mQSPanel != null) {
Jorim Jaggi290600a2014-05-30 17:02:20 +0200263 mQSPanel.setExpanded(expanded && !overscrolled);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400264 }
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200265 updateClockScale();
266 updateAvatarScale();
267 updateClockLp();
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200268 updateBatteryLevelPaddingEnd();
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200269 updateBatteryLevelLp();
John Spurlock312b7922014-07-22 22:23:42 -0400270 mStatusIconClipper.update();
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200271 }
Jorim Jaggi9054d942014-05-09 22:47:28 +0200272 }
273
274 private void updateHeights() {
Jorim Jaggibc5f4962014-05-12 00:00:52 +0200275 boolean onKeyguardAndCollapsed = mKeyguardShowing && !mExpanded;
Jorim Jaggi9054d942014-05-09 22:47:28 +0200276 int height;
277 if (mExpanded) {
278 height = mExpandedHeight;
Jorim Jaggibc5f4962014-05-12 00:00:52 +0200279 } else if (onKeyguardAndCollapsed) {
Jorim Jaggi9054d942014-05-09 22:47:28 +0200280 height = mKeyguardHeight;
281 } else {
282 height = mCollapsedHeight;
283 }
284 ViewGroup.LayoutParams lp = getLayoutParams();
285 if (lp.height != height) {
286 lp.height = height;
Jorim Jaggid7daab72014-05-06 22:22:20 +0200287 setLayoutParams(lp);
Jorim Jaggi9054d942014-05-09 22:47:28 +0200288 }
Jorim Jaggibc5f4962014-05-12 00:00:52 +0200289 int systemIconsContainerHeight = onKeyguardAndCollapsed ? mKeyguardHeight : mCollapsedHeight;
Jorim Jaggi605f1902014-06-25 05:23:42 +0200290 lp = mSystemIconsSuperContainer.getLayoutParams();
Jorim Jaggi9054d942014-05-09 22:47:28 +0200291 if (lp.height != systemIconsContainerHeight) {
292 lp.height = systemIconsContainerHeight;
Jorim Jaggi605f1902014-06-25 05:23:42 +0200293 mSystemIconsSuperContainer.setLayoutParams(lp);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200294 }
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200295 lp = mMultiUserSwitch.getLayoutParams();
296 if (lp.height != systemIconsContainerHeight) {
297 lp.height = systemIconsContainerHeight;
298 mMultiUserSwitch.setLayoutParams(lp);
299 }
Jorim Jaggid7daab72014-05-06 22:22:20 +0200300 }
301
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200302 private void updateWidth() {
Adrian Roos13dee432014-06-10 19:42:47 +0200303 int width = (mKeyguardShowing && !mExpanded) ? mKeyguardWidth : mNormalWidth;
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200304 ViewGroup.LayoutParams lp = getLayoutParams();
305 if (width != lp.width) {
306 lp.width = width;
307 setLayoutParams(lp);
308 }
309 }
310
Jorim Jaggi740beb52014-05-11 18:53:19 +0200311 private void updateVisibilities() {
Jorim Jaggibc5f4962014-05-12 00:00:52 +0200312 boolean onKeyguardAndCollapsed = mKeyguardShowing && !mExpanded;
Jorim Jaggi853b0702014-07-05 04:31:14 +0200313 if (onKeyguardAndCollapsed) {
314 setBackground(null);
315 } else {
316 setBackgroundResource(R.drawable.notification_header_bg);
317 }
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200318 mDateGroup.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE);
319 mClock.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE);
Jorim Jaggibc5f4962014-05-12 00:00:52 +0200320 mKeyguardCarrierText.setVisibility(onKeyguardAndCollapsed ? View.VISIBLE : View.GONE);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200321 mDateCollapsed.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing
322 ? View.VISIBLE : View.GONE);
323 mDateExpanded.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing
324 ? View.GONE : View.VISIBLE);
325 mAlarmStatus.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing
326 ? View.VISIBLE : View.GONE);
Jorim Jaggi290600a2014-05-30 17:02:20 +0200327 mSettingsButton.setVisibility(mExpanded && !mOverscrolled ? View.VISIBLE : View.GONE);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400328 mQsDetailHeader.setVisibility(mExpanded ? View.VISIBLE : View.GONE);
John Spurlock604ae092014-07-17 18:22:45 -0400329 if (mStatusIcons != null) {
330 mStatusIcons.setVisibility(!mExpanded || mOverscrolled ? View.VISIBLE : View.GONE);
331 }
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200332 if (mSignalCluster != null) {
Jorim Jaggi290600a2014-05-30 17:02:20 +0200333 mSignalCluster.setVisibility(!mExpanded || mOverscrolled ? View.VISIBLE : View.GONE);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200334 }
Adrian Roos59a61272014-06-06 19:07:24 +0200335 mEmergencyCallsOnly.setVisibility(mExpanded && !mOverscrolled && mShowEmergencyCallsOnly
336 ? VISIBLE : GONE);
Adrian Roos8ddb2da2014-06-16 18:56:22 -0700337 mMultiUserSwitch.setVisibility(mExpanded || !mKeyguardUserSwitcherShowing
338 ? VISIBLE : GONE);
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200339 mBatteryLevel.setVisibility(mKeyguardShowing && mCharging || mExpanded && !mOverscrolled
340 ? View.VISIBLE : View.GONE);
Jorim Jaggibc976e32014-07-25 16:42:34 +0200341 if (mExpanded && !mOverscrolled && mKeyguardUserSwitcherShowing) {
342 mKeyguardUserSwitcher.hide();
343 }
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200344 }
345
346 private void updateSystemIconsLayoutParams() {
Jorim Jaggi605f1902014-06-25 05:23:42 +0200347 RelativeLayout.LayoutParams lp = (LayoutParams) mSystemIconsSuperContainer.getLayoutParams();
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200348 lp.addRule(RelativeLayout.START_OF, mExpanded && !mOverscrolled
Jorim Jaggi853b0702014-07-05 04:31:14 +0200349 ? mSettingsButton.getId()
350 : mMultiUserSwitch.getId());
351 lp.removeRule(ALIGN_PARENT_START);
352 if (mMultiUserSwitch.getVisibility() == GONE) {
353 lp.setMarginEnd(mSystemIconsSwitcherHiddenExpandedMargin);
Adrian Roos59a61272014-06-06 19:07:24 +0200354 } else {
Jorim Jaggi853b0702014-07-05 04:31:14 +0200355 lp.setMarginEnd(0);
Adrian Roos59a61272014-06-06 19:07:24 +0200356 }
Jorim Jaggi605f1902014-06-25 05:23:42 +0200357 mSystemIconsSuperContainer.setLayoutParams(lp);
Jorim Jaggi740beb52014-05-11 18:53:19 +0200358 }
359
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200360 private void updateListeners() {
Jorim Jaggi853b0702014-07-05 04:31:14 +0200361 if (mListening) {
362 mBatteryController.addStateChangedCallback(this);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200363 mNextAlarmController.addStateChangedCallback(this);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200364 } else {
365 mBatteryController.removeStateChangedCallback(this);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200366 mNextAlarmController.removeStateChangedCallback(this);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200367 }
368 }
369
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200370 private void updateAvatarScale() {
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200371 if (mExpanded && !mOverscrolled) {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200372 mMultiUserSwitch.setScaleX(1f);
373 mMultiUserSwitch.setScaleY(1f);
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200374 } else if (mKeyguardShowing) {
375 mMultiUserSwitch.setScaleX(mAvatarKeyguardScaleFactor);
376 mMultiUserSwitch.setScaleY(mAvatarKeyguardScaleFactor);
377 } else {
378 mMultiUserSwitch.setScaleX(mAvatarCollapsedScaleFactor);
379 mMultiUserSwitch.setScaleY(mAvatarCollapsedScaleFactor);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200380 }
381 }
382
383 private void updateClockScale() {
Jorim Jaggi329fa242014-07-11 21:42:00 +0200384 mAmPm.setScaleX(mClockCollapsedScaleFactor);
385 mAmPm.setScaleY(mClockCollapsedScaleFactor);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200386 if (!mExpanded || mOverscrolled) {
Jorim Jaggi329fa242014-07-11 21:42:00 +0200387 mTime.setScaleX(mClockCollapsedScaleFactor);
388 mTime.setScaleY(mClockCollapsedScaleFactor);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200389 } else {
Jorim Jaggi329fa242014-07-11 21:42:00 +0200390 mTime.setScaleX(1f);
391 mTime.setScaleY(1f);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200392 }
Jorim Jaggi329fa242014-07-11 21:42:00 +0200393 updateAmPmTranslation();
394 }
395
396 private void updateAmPmTranslation() {
397 boolean rtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
398 mAmPm.setTranslationX((rtl ? 1 : -1) * mTime.getWidth() * (1 - mTime.getScaleX()));
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200399 }
400
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200401 private void updateBatteryLevelPaddingEnd() {
402 mBatteryLevel.setPaddingRelative(0, 0,
403 mKeyguardShowing && !mExpanded ? 0 : mBatteryPaddingEnd, 0);
404 }
405
Jorim Jaggi853b0702014-07-05 04:31:14 +0200406 @Override
407 public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
408 mBatteryLevel.setText(getResources().getString(R.string.battery_level_template, level));
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200409 boolean changed = mCharging != charging;
410 mCharging = charging;
411 if (changed) {
412 updateVisibilities();
413 }
Jorim Jaggi853b0702014-07-05 04:31:14 +0200414 }
415
John Spurlock0ff62e02014-07-22 16:15:08 -0400416 @Override
417 public void onPowerSaveChanged() {
418 // could not care less
419 }
420
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200421 @Override
422 public void onNextAlarmChanged(AlarmClockInfo nextAlarm) {
423 mNextAlarm = nextAlarm;
424 if (nextAlarm != null) {
425 mAlarmStatus.setText(KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm));
426 }
427 mAlarmShowing = nextAlarm != null;
428 updateVisibilities();
429 }
430
431
Jorim Jaggi5d6957e2014-05-26 02:15:06 +0200432 private void updateClickTargets() {
Jorim Jaggi853b0702014-07-05 04:31:14 +0200433 setClickable(!mKeyguardShowing || mExpanded);
Adrian Roos723632e2014-07-23 21:13:21 +0200434
435 boolean keyguardSwitcherAvailable =
Jorim Jaggibc976e32014-07-25 16:42:34 +0200436 mKeyguardUserSwitcher != null && mKeyguardShowing && !mExpanded;
Adrian Roos723632e2014-07-23 21:13:21 +0200437 mMultiUserSwitch.setClickable(mExpanded || keyguardSwitcherAvailable);
438 mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200439 mSystemIconsSuperContainer.setClickable(mExpanded);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200440 mAlarmStatus.setClickable(mNextAlarm != null && mNextAlarm.getShowIntent() != null);
Jorim Jaggi5d6957e2014-05-26 02:15:06 +0200441 }
442
Jorim Jaggif62f2bb2014-05-25 22:28:41 +0200443 private void updateZTranslation() {
444
445 // If we are on the Keyguard, we need to set our z position to zero, so we don't get
446 // shadows.
447 if (mKeyguardShowing && !mExpanded) {
448 setZ(0);
449 } else {
450 setTranslationZ(0);
451 }
452 }
453
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200454 private void updatePadding() {
455 boolean padded = !mKeyguardShowing || mExpanded;
456 int padding = padded ? mPadding : 0;
457 setPaddingRelative(padding, 0, padding, 0);
458 }
459
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200460 private void updateClockLp() {
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200461 int marginBottom = mExpanded && !mOverscrolled
462 ? mClockMarginBottomExpanded
463 : mClockMarginBottomCollapsed;
464 LayoutParams lp = (LayoutParams) mDateGroup.getLayoutParams();
465 if (marginBottom != lp.bottomMargin) {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200466 lp.bottomMargin = marginBottom;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200467 mDateGroup.setLayoutParams(lp);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200468 }
469 }
470
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200471 private void updateMultiUserSwitch() {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200472 int marginEnd;
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200473 int width;
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200474 if (mExpanded && !mOverscrolled) {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200475 marginEnd = mMultiUserExpandedMargin;
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200476 width = mMultiUserSwitchWidthExpanded;
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200477 } else if (mKeyguardShowing) {
478 marginEnd = mMultiUserKeyguardMargin;
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200479 width = mMultiUserSwitchWidthKeyguard;
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200480 } else {
481 marginEnd = mMultiUserCollapsedMargin;
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200482 width = mMultiUserSwitchWidthCollapsed;
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200483 }
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200484 MarginLayoutParams lp = (MarginLayoutParams) mMultiUserSwitch.getLayoutParams();
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200485 if (marginEnd != lp.getMarginEnd() || lp.width != width) {
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200486 lp.setMarginEnd(marginEnd);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200487 lp.width = width;
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200488 mMultiUserSwitch.setLayoutParams(lp);
489 }
490 }
491
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200492 private void updateBatteryLevelLp() {
493 int marginStart = mExpanded && !mOverscrolled
494 ? mBatteryMarginExpanded
495 : mBatteryMarginKeyguard;
496 MarginLayoutParams lp = (MarginLayoutParams) mBatteryLevel.getLayoutParams();
497 if (marginStart != lp.getMarginStart()) {
498 lp.setMarginStart(marginStart);
499 mBatteryLevel.setLayoutParams(lp);
500 }
501 }
502
Jorim Jaggi54045422014-07-03 18:30:40 +0200503 public void setExpansion(float t) {
504 float height = mCollapsedHeight + t * (mExpandedHeight - mCollapsedHeight);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200505 if (height < mCollapsedHeight) {
506 height = mCollapsedHeight;
507 }
508 if (height > mExpandedHeight) {
509 height = mExpandedHeight;
510 }
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +0200511 setClipping(height);
512 }
513
514 private void setClipping(float height) {
515 mClipBounds.set(getPaddingLeft(), 0, getWidth() - getPaddingRight(), (int) height);
516 setClipBounds(mClipBounds);
Chris Craik7b7ca3c2014-07-11 13:32:19 -0700517 invalidateOutline();
Jorim Jaggid7daab72014-05-06 22:22:20 +0200518 }
519
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200520 public void attachSystemIcons(LinearLayout systemIcons) {
521 mSystemIconsContainer.addView(systemIcons);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200522 mStatusIcons = systemIcons.findViewById(R.id.statusIcons);
523 mSignalCluster = systemIcons.findViewById(R.id.signal_cluster);
John Spurlock312b7922014-07-22 22:23:42 -0400524 mSignalCluster.addOnLayoutChangeListener(mStatusIconClipper);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200525 }
526
527 public void onSystemIconsDetached() {
528 if (mStatusIcons != null) {
John Spurlock604ae092014-07-17 18:22:45 -0400529 mStatusIcons.setVisibility(View.VISIBLE);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200530 }
531 if (mSignalCluster != null) {
John Spurlock312b7922014-07-22 22:23:42 -0400532 mSignalCluster.removeOnLayoutChangeListener(mStatusIconClipper);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200533 mSignalCluster.setVisibility(View.VISIBLE);
534 }
535 mStatusIcons = null;
536 mSignalCluster = null;
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200537 }
538
539 public void setKeyguardShowing(boolean keyguardShowing) {
Jorim Jaggi9054d942014-05-09 22:47:28 +0200540 mKeyguardShowing = keyguardShowing;
Jorim Jaggi9054d942014-05-09 22:47:28 +0200541 updateHeights();
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200542 updateWidth();
Jorim Jaggi740beb52014-05-11 18:53:19 +0200543 updateVisibilities();
Jorim Jaggif62f2bb2014-05-25 22:28:41 +0200544 updateZTranslation();
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200545 updatePadding();
546 updateMultiUserSwitch();
Jorim Jaggi853b0702014-07-05 04:31:14 +0200547 updateClickTargets();
Jorim Jaggid4aafe92014-07-10 21:00:57 +0200548 updateBatteryLevelPaddingEnd();
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200549 updateAvatarScale();
John Spurlock312b7922014-07-22 22:23:42 -0400550 mStatusIconClipper.update();
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200551 }
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200552
553 public void setUserInfoController(UserInfoController userInfoController) {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200554 userInfoController.addListener(new UserInfoController.OnUserInfoChangedListener() {
555 @Override
556 public void onUserInfoChanged(String name, Drawable picture) {
557 mMultiUserAvatar.setImageDrawable(picture);
558 }
559 });
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200560 }
561
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200562 @Override
563 public void onClick(View v) {
564 if (v == mSettingsButton) {
565 startSettingsActivity();
Jorim Jaggi853b0702014-07-05 04:31:14 +0200566 } else if (v == mSystemIconsSuperContainer) {
567 startBatteryActivity();
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200568 } else if (v == mAlarmStatus && mNextAlarm != null) {
569 PendingIntent showIntent = mNextAlarm.getShowIntent();
570 if (showIntent != null && showIntent.isActivity()) {
571 mActivityStarter.startActivity(showIntent.getIntent());
572 }
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200573 }
574 }
575
576 private void startSettingsActivity() {
577 mActivityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
578 }
John Spurlockaf8d6c42014-05-07 17:49:08 -0400579
Jorim Jaggi853b0702014-07-05 04:31:14 +0200580 private void startBatteryActivity() {
581 mActivityStarter.startActivity(new Intent(Intent.ACTION_POWER_USAGE_SUMMARY));
582 }
583
John Spurlockaf8d6c42014-05-07 17:49:08 -0400584 public void setQSPanel(QSPanel qsp) {
585 mQSPanel = qsp;
John Spurlock3e04cc82014-05-30 12:34:03 -0400586 if (mQSPanel != null) {
587 mQSPanel.setCallback(mQsPanelCallback);
588 }
Adrian Roos1ef80fe2014-07-14 22:53:54 +0200589 mMultiUserSwitch.setQsPanel(qsp);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400590 }
John Spurlock3e04cc82014-05-30 12:34:03 -0400591
Adrian Roos723632e2014-07-23 21:13:21 +0200592 public void setKeyguarUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
Jorim Jaggibc976e32014-07-25 16:42:34 +0200593 mKeyguardUserSwitcher = keyguardUserSwitcher;
Adrian Roos723632e2014-07-23 21:13:21 +0200594 mMultiUserSwitch.setKeyguardUserSwitcher(keyguardUserSwitcher);
595 }
596
Selim Cinekc0ce82d2014-06-10 13:21:15 +0200597 @Override
598 public boolean shouldDelayChildPressedState() {
599 return true;
600 }
Selim Cinek45f904a2014-06-11 11:42:53 +0200601
Adrian Roos59a61272014-06-06 19:07:24 +0200602 public void setShowEmergencyCallsOnly(boolean show) {
603 mShowEmergencyCallsOnly = show;
604 if (mExpanded) {
605 updateVisibilities();
Adrian Roos59a61272014-06-06 19:07:24 +0200606 }
607 }
608
Adrian Roos8ddb2da2014-06-16 18:56:22 -0700609 public void setKeyguardUserSwitcherShowing(boolean showing) {
Adrian Roos8ddb2da2014-06-16 18:56:22 -0700610 mKeyguardUserSwitcherShowing = showing;
611 updateVisibilities();
612 updateSystemIconsLayoutParams();
613 }
Jorim Jaggi2580a9762014-06-25 03:08:25 +0200614
615 @Override
616 public boolean hasOverlappingRendering() {
617 return !mKeyguardShowing || mExpanded;
618 }
John Spurlock7f8f22a2014-07-02 18:54:17 -0400619
Jorim Jaggi266f6772014-07-10 19:13:17 +0200620 @Override
621 protected void dispatchSetPressed(boolean pressed) {
622 // We don't want that everything lights up when we click on the header, so block the request
623 // here.
624 }
625
John Spurlock312b7922014-07-22 22:23:42 -0400626 private final class StatusIconClipper implements OnLayoutChangeListener {
John Spurlock07f6d3b2014-07-17 10:11:40 -0400627 private final Rect mClipBounds = new Rect();
628
629 @Override
630 public void onLayoutChange(View v, int left, int top, int right,
631 int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
632 // Hide the statusIcons in the header by clipping them. Can't touch visibility since
633 // they are mirrored to the real status bar.
John Spurlock604ae092014-07-17 18:22:45 -0400634 mClipBounds.set(left, 0, mSystemIconsContainer.getWidth(),
635 mSystemIconsContainer.getHeight());
John Spurlock312b7922014-07-22 22:23:42 -0400636 update();
John Spurlock07f6d3b2014-07-17 10:11:40 -0400637 }
John Spurlock312b7922014-07-22 22:23:42 -0400638
639 public void update() {
John Spurlock2eec8fe2014-07-24 12:16:14 -0400640 final boolean collapsedKeyguard = mKeyguardShowing && !mExpanded;
641 final boolean expanded = mExpanded && !mOverscrolled;
642 mSystemIconsContainer.setClipBounds(collapsedKeyguard || expanded ? null : mClipBounds);
John Spurlock312b7922014-07-22 22:23:42 -0400643 }
644 }
John Spurlock07f6d3b2014-07-17 10:11:40 -0400645
John Spurlock7f8f22a2014-07-02 18:54:17 -0400646 private final QSPanel.Callback mQsPanelCallback = new QSPanel.Callback() {
647 @Override
648 public void onToggleStateChanged(final boolean state) {
649 post(new Runnable() {
650 @Override
651 public void run() {
652 handleToggleStateChanged(state);
653 }
654 });
655 }
656
657 @Override
658 public void onShowingDetail(final QSTile.DetailAdapter detail) {
659 post(new Runnable() {
660 @Override
661 public void run() {
662 handleShowingDetail(detail);
663 }
664 });
665 }
666
John Spurlock486b78e2014-07-07 08:37:56 -0400667 @Override
668 public void onScanStateChanged(final boolean state) {
669 post(new Runnable() {
670 @Override
671 public void run() {
672 handleScanStateChanged(state);
673 }
674 });
675 }
676
John Spurlock7f8f22a2014-07-02 18:54:17 -0400677 private void handleToggleStateChanged(boolean state) {
John Spurlock486b78e2014-07-07 08:37:56 -0400678 mQsDetailHeaderSwitch.setChecked(state);
679 }
680
681 private void handleScanStateChanged(boolean state) {
682 // TODO - waiting on framework asset
John Spurlock7f8f22a2014-07-02 18:54:17 -0400683 }
684
685 private void handleShowingDetail(final QSTile.DetailAdapter detail) {
686 final boolean showingDetail = detail != null;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200687 transition(mClock, !showingDetail);
688 transition(mDateGroup, !showingDetail);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400689 transition(mQsDetailHeader, showingDetail);
690 if (showingDetail) {
John Spurlock486b78e2014-07-07 08:37:56 -0400691 mQsDetailHeaderTitle.setText(detail.getTitle());
John Spurlock7f8f22a2014-07-02 18:54:17 -0400692 final Boolean toggleState = detail.getToggleState();
693 if (toggleState == null) {
John Spurlock486b78e2014-07-07 08:37:56 -0400694 mQsDetailHeaderSwitch.setVisibility(INVISIBLE);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400695 mQsDetailHeader.setClickable(false);
696 } else {
John Spurlock486b78e2014-07-07 08:37:56 -0400697 mQsDetailHeaderSwitch.setVisibility(VISIBLE);
698 mQsDetailHeaderSwitch.setChecked(toggleState);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400699 mQsDetailHeader.setClickable(true);
700 mQsDetailHeader.setOnClickListener(new OnClickListener() {
701 @Override
702 public void onClick(View v) {
John Spurlocka7cf5592014-07-15 10:55:08 -0400703 detail.setToggleState(!mQsDetailHeaderSwitch.isChecked());
John Spurlock7f8f22a2014-07-02 18:54:17 -0400704 }
705 });
706 }
707 } else {
708 mQsDetailHeader.setClickable(false);
709 }
710 }
711
712 private void transition(final View v, final boolean in) {
713 if (in) {
714 v.bringToFront();
715 }
716 v.animate().alpha(in ? 1 : 0).withLayer().start();
717 }
718 };
Jorim Jaggid7daab72014-05-06 22:22:20 +0200719}