blob: 247252cfcc48eacc8a6fe8c73d84083ec3c0de50 [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
Jose Lima235510e2014-08-13 12:50:01 -070019import android.app.AlarmManager;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020020import 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 Jaggie17c4b42014-08-26 17:27:31 +020023import android.content.res.Configuration;
24import android.content.res.Resources;
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +020025import android.graphics.Outline;
26import android.graphics.Rect;
John Spurlock465cefa2014-08-16 10:39:33 -040027import android.graphics.drawable.Animatable;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020028import android.graphics.drawable.Drawable;
Jorim Jaggid7daab72014-05-06 22:22:20 +020029import android.util.AttributeSet;
Jorim Jaggie17c4b42014-08-26 17:27:31 +020030import android.util.MathUtils;
Jorim Jaggifc69f782014-08-14 16:55:35 +020031import android.util.TypedValue;
Jorim Jaggid7daab72014-05-06 22:22:20 +020032import android.view.View;
33import android.view.ViewGroup;
Chris Craik7b7ca3c2014-07-11 13:32:19 -070034import android.view.ViewOutlineProvider;
Jorim Jaggif056e352014-05-11 23:09:22 +020035import android.widget.ImageView;
Jorim Jaggid7daab72014-05-06 22:22:20 +020036import android.widget.LinearLayout;
37import android.widget.RelativeLayout;
John Spurlock7f8f22a2014-07-02 18:54:17 -040038import android.widget.Switch;
Adrian Roos59a61272014-06-06 19:07:24 +020039import android.widget.TextView;
Jorim Jaggid7daab72014-05-06 22:22:20 +020040
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020041import com.android.keyguard.KeyguardStatusView;
Jorim Jaggi06d551a2014-09-02 15:55:57 +020042import com.android.systemui.BatteryMeterView;
Jorim Jaggie17c4b42014-08-26 17:27:31 +020043import com.android.systemui.FontSizeUtils;
Jorim Jaggid7daab72014-05-06 22:22:20 +020044import com.android.systemui.R;
John Spurlockaf8d6c42014-05-07 17:49:08 -040045import com.android.systemui.qs.QSPanel;
John Spurlock7f8f22a2014-07-02 18:54:17 -040046import com.android.systemui.qs.QSTile;
Jorim Jaggi853b0702014-07-05 04:31:14 +020047import com.android.systemui.statusbar.policy.BatteryController;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020048import com.android.systemui.statusbar.policy.NextAlarmController;
Jorim Jaggi3d878be2014-05-10 03:22:32 +020049import com.android.systemui.statusbar.policy.UserInfoController;
Jorim Jaggid7daab72014-05-06 22:22:20 +020050
Elliott Hughes88d25512014-10-03 12:06:17 -070051import java.text.NumberFormat;
52
Jorim Jaggid7daab72014-05-06 22:22:20 +020053/**
54 * The view to manage the header area in the expanded status bar.
55 */
Jorim Jaggi853b0702014-07-05 04:31:14 +020056public class StatusBarHeaderView extends RelativeLayout implements View.OnClickListener,
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020057 BatteryController.BatteryStateChangeCallback, NextAlarmController.NextAlarmChangeCallback {
Jorim Jaggif62f2bb2014-05-25 22:28:41 +020058
Jorim Jaggid7daab72014-05-06 22:22:20 +020059 private boolean mExpanded;
Jorim Jaggie65e3102014-07-01 22:00:50 +020060 private boolean mListening;
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020061
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +020062 private ViewGroup mSystemIconsContainer;
Jorim Jaggi605f1902014-06-25 05:23:42 +020063 private View mSystemIconsSuperContainer;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020064 private View mDateGroup;
65 private View mClock;
Jorim Jaggifc69f782014-08-14 16:55:35 +020066 private TextView mTime;
Jorim Jaggie17c4b42014-08-26 17:27:31 +020067 private TextView mAmPm;
Jorim Jaggi3d878be2014-05-10 03:22:32 +020068 private MultiUserSwitch mMultiUserSwitch;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020069 private ImageView mMultiUserAvatar;
Jorim Jaggie17c4b42014-08-26 17:27:31 +020070 private TextView mDateCollapsed;
71 private TextView mDateExpanded;
Jorim Jaggi90e0df22014-07-30 01:10:35 +020072 private LinearLayout mSystemIcons;
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +020073 private View mSignalCluster;
74 private View mSettingsButton;
John Spurlock7f8f22a2014-07-02 18:54:17 -040075 private View mQsDetailHeader;
John Spurlock486b78e2014-07-07 08:37:56 -040076 private TextView mQsDetailHeaderTitle;
77 private Switch mQsDetailHeaderSwitch;
John Spurlock465cefa2014-08-16 10:39:33 -040078 private ImageView mQsDetailHeaderProgress;
Jorim Jaggie17c4b42014-08-26 17:27:31 +020079 private TextView mEmergencyCallsOnly;
Jorim Jaggi853b0702014-07-05 04:31:14 +020080 private TextView mBatteryLevel;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020081 private TextView mAlarmStatus;
Adrian Roos59a61272014-06-06 19:07:24 +020082
83 private boolean mShowEmergencyCallsOnly;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020084 private boolean mAlarmShowing;
Jose Lima235510e2014-08-13 12:50:01 -070085 private AlarmManager.AlarmClockInfo mNextAlarm;
Jorim Jaggid7daab72014-05-06 22:22:20 +020086
87 private int mCollapsedHeight;
88 private int mExpandedHeight;
Jorim Jaggi9054d942014-05-09 22:47:28 +020089
Jorim Jaggi129e7ac2014-06-10 22:03:48 +020090 private int mMultiUserExpandedMargin;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020091 private int mMultiUserCollapsedMargin;
Jorim Jaggi4538027d2014-07-30 15:43:13 +020092
Jorim Jaggi3f48f462014-07-08 16:53:29 +020093 private int mClockMarginBottomExpanded;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +020094 private int mClockMarginBottomCollapsed;
Jorim Jaggi3f48f462014-07-08 16:53:29 +020095 private int mMultiUserSwitchWidthCollapsed;
96 private int mMultiUserSwitchWidthExpanded;
97
Jorim Jaggifc69f782014-08-14 16:55:35 +020098 private int mClockCollapsedSize;
99 private int mClockExpandedSize;
100
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200101 /**
102 * In collapsed QS, the clock and avatar are scaled down a bit post-layout to allow for a nice
103 * transition. These values determine that factor.
104 */
105 private float mClockCollapsedScaleFactor;
106 private float mAvatarCollapsedScaleFactor;
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200107
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200108 private ActivityStarter mActivityStarter;
Jorim Jaggi853b0702014-07-05 04:31:14 +0200109 private BatteryController mBatteryController;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200110 private NextAlarmController mNextAlarmController;
John Spurlockaf8d6c42014-05-07 17:49:08 -0400111 private QSPanel mQSPanel;
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200112
Jorim Jaggid7daab72014-05-06 22:22:20 +0200113
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +0200114 private final Rect mClipBounds = new Rect();
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200115
116 private boolean mCaptureValues;
117 private boolean mSignalClusterDetached;
118 private final LayoutValues mCollapsedValues = new LayoutValues();
119 private final LayoutValues mExpandedValues = new LayoutValues();
120 private final LayoutValues mCurrentValues = new LayoutValues();
121
122 private float mCurrentT;
Selim Cineke32010a2014-08-20 23:50:41 +0200123 private boolean mShowingDetail;
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +0200124
Jorim Jaggid7daab72014-05-06 22:22:20 +0200125 public StatusBarHeaderView(Context context, AttributeSet attrs) {
126 super(context, attrs);
127 }
128
129 @Override
130 protected void onFinishInflate() {
131 super.onFinishInflate();
Jorim Jaggi605f1902014-06-25 05:23:42 +0200132 mSystemIconsSuperContainer = findViewById(R.id.system_icons_super_container);
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200133 mSystemIconsContainer = (ViewGroup) findViewById(R.id.system_icons_container);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200134 mSystemIconsSuperContainer.setOnClickListener(this);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200135 mDateGroup = findViewById(R.id.date_group);
136 mClock = findViewById(R.id.clock);
Jorim Jaggifc69f782014-08-14 16:55:35 +0200137 mTime = (TextView) findViewById(R.id.time_view);
Jorim Jaggie17c4b42014-08-26 17:27:31 +0200138 mAmPm = (TextView) findViewById(R.id.am_pm_view);
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200139 mMultiUserSwitch = (MultiUserSwitch) findViewById(R.id.multi_user_switch);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200140 mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar);
Jorim Jaggie17c4b42014-08-26 17:27:31 +0200141 mDateCollapsed = (TextView) findViewById(R.id.date_collapsed);
142 mDateExpanded = (TextView) findViewById(R.id.date_expanded);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200143 mSettingsButton = findViewById(R.id.settings_button);
144 mSettingsButton.setOnClickListener(this);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400145 mQsDetailHeader = findViewById(R.id.qs_detail_header);
146 mQsDetailHeader.setAlpha(0);
John Spurlock486b78e2014-07-07 08:37:56 -0400147 mQsDetailHeaderTitle = (TextView) mQsDetailHeader.findViewById(android.R.id.title);
148 mQsDetailHeaderSwitch = (Switch) mQsDetailHeader.findViewById(android.R.id.toggle);
John Spurlock465cefa2014-08-16 10:39:33 -0400149 mQsDetailHeaderProgress = (ImageView) findViewById(R.id.qs_detail_header_progress);
Jorim Jaggie17c4b42014-08-26 17:27:31 +0200150 mEmergencyCallsOnly = (TextView) findViewById(R.id.header_emergency_calls_only);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200151 mBatteryLevel = (TextView) findViewById(R.id.battery_level);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200152 mAlarmStatus = (TextView) findViewById(R.id.alarm_status);
153 mAlarmStatus.setOnClickListener(this);
Jorim Jaggi06d551a2014-09-02 15:55:57 +0200154 mSignalCluster = findViewById(R.id.signal_cluster);
155 mSystemIcons = (LinearLayout) findViewById(R.id.system_icons);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200156 loadDimens();
John Spurlocke86ae852014-05-17 16:18:27 -0400157 updateVisibilities();
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200158 updateClockScale();
159 updateAvatarScale();
John Spurlockd9792b72014-05-21 23:50:13 -0400160 addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
161 @Override
162 public void onLayoutChange(View v, int left, int top, int right,
163 int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
164 if ((right - left) != (oldRight - oldLeft)) {
165 // width changed, update clipping
166 setClipping(getHeight());
167 }
Jorim Jaggi329fa242014-07-11 21:42:00 +0200168 boolean rtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
169 mTime.setPivotX(rtl ? mTime.getWidth() : 0);
170 mTime.setPivotY(mTime.getBaseline());
Jorim Jaggi329fa242014-07-11 21:42:00 +0200171 updateAmPmTranslation();
John Spurlockd9792b72014-05-21 23:50:13 -0400172 }
173 });
Chris Craik7b7ca3c2014-07-11 13:32:19 -0700174 setOutlineProvider(new ViewOutlineProvider() {
175 @Override
Chris Craik31ba1922014-07-18 13:48:09 -0700176 public void getOutline(View view, Outline outline) {
Chris Craik7b7ca3c2014-07-11 13:32:19 -0700177 outline.setRect(mClipBounds);
Chris Craik7b7ca3c2014-07-11 13:32:19 -0700178 }
179 });
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200180 requestCaptureValues();
181 }
182
183 @Override
184 protected void onLayout(boolean changed, int l, int t, int r, int b) {
185 super.onLayout(changed, l, t, r, b);
186 if (mCaptureValues) {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200187 if (mExpanded) {
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200188 captureLayoutValues(mExpandedValues);
189 } else {
190 captureLayoutValues(mCollapsedValues);
191 }
192 mCaptureValues = false;
193 updateLayoutValues(mCurrentT);
194 }
195 mAlarmStatus.setX(mDateGroup.getLeft() + mDateCollapsed.getRight());
196 }
197
Jorim Jaggie17c4b42014-08-26 17:27:31 +0200198 @Override
199 protected void onConfigurationChanged(Configuration newConfig) {
200 super.onConfigurationChanged(newConfig);
201 FontSizeUtils.updateFontSize(mBatteryLevel, R.dimen.battery_level_text_size);
202 FontSizeUtils.updateFontSize(mEmergencyCallsOnly,
203 R.dimen.qs_emergency_calls_only_text_size);
204 FontSizeUtils.updateFontSize(mDateCollapsed, R.dimen.qs_date_collapsed_size);
205 FontSizeUtils.updateFontSize(mDateExpanded, R.dimen.qs_date_collapsed_size);
206 FontSizeUtils.updateFontSize(mAlarmStatus, R.dimen.qs_date_collapsed_size);
207 FontSizeUtils.updateFontSize(this, android.R.id.title, R.dimen.qs_detail_header_text_size);
208 FontSizeUtils.updateFontSize(this, android.R.id.toggle, R.dimen.qs_detail_header_text_size);
209 FontSizeUtils.updateFontSize(mAmPm, R.dimen.qs_time_collapsed_size);
210 FontSizeUtils.updateFontSize(this, R.id.empty_time_view, R.dimen.qs_time_expanded_size);
211
Adrian Roos54f934c2014-09-17 18:35:32 +0200212 mEmergencyCallsOnly.setText(com.android.internal.R.string.emergency_calls_only);
213
Jorim Jaggie17c4b42014-08-26 17:27:31 +0200214 mClockCollapsedSize = getResources().getDimensionPixelSize(R.dimen.qs_time_collapsed_size);
215 mClockExpandedSize = getResources().getDimensionPixelSize(R.dimen.qs_time_expanded_size);
216 mClockCollapsedScaleFactor = (float) mClockCollapsedSize / (float) mClockExpandedSize;
217
218 updateClockScale();
219 updateClockCollapsedMargin();
220 }
221
222 private void updateClockCollapsedMargin() {
223 Resources res = getResources();
224 int padding = res.getDimensionPixelSize(R.dimen.clock_collapsed_bottom_margin);
225 int largePadding = res.getDimensionPixelSize(
226 R.dimen.clock_collapsed_bottom_margin_large_text);
227 float largeFactor = (MathUtils.constrain(getResources().getConfiguration().fontScale, 1.0f,
228 FontSizeUtils.LARGE_TEXT_SCALE) - 1f) / (FontSizeUtils.LARGE_TEXT_SCALE - 1f);
229 mClockMarginBottomCollapsed = Math.round((1 - largeFactor) * padding + largeFactor * largePadding);
230 requestLayout();
231 }
232
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200233 private void requestCaptureValues() {
234 mCaptureValues = true;
235 requestLayout();
Jorim Jaggid7daab72014-05-06 22:22:20 +0200236 }
237
238 private void loadDimens() {
Jorim Jaggi0d74eeb2014-05-09 22:05:24 +0200239 mCollapsedHeight = getResources().getDimensionPixelSize(R.dimen.status_bar_header_height);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200240 mExpandedHeight = getResources().getDimensionPixelSize(
241 R.dimen.status_bar_header_height_expanded);
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200242 mMultiUserExpandedMargin =
243 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_expanded_margin);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200244 mMultiUserCollapsedMargin =
245 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_collapsed_margin);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200246 mClockMarginBottomExpanded =
247 getResources().getDimensionPixelSize(R.dimen.clock_expanded_bottom_margin);
Jorim Jaggie17c4b42014-08-26 17:27:31 +0200248 updateClockCollapsedMargin();
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200249 mMultiUserSwitchWidthCollapsed =
250 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_collapsed);
251 mMultiUserSwitchWidthExpanded =
252 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_expanded);
253 mAvatarCollapsedScaleFactor =
254 getResources().getDimensionPixelSize(R.dimen.multi_user_avatar_collapsed_size)
255 / (float) mMultiUserAvatar.getLayoutParams().width;
Jorim Jaggifc69f782014-08-14 16:55:35 +0200256 mClockCollapsedSize = getResources().getDimensionPixelSize(R.dimen.qs_time_collapsed_size);
257 mClockExpandedSize = getResources().getDimensionPixelSize(R.dimen.qs_time_expanded_size);
258 mClockCollapsedScaleFactor = (float) mClockCollapsedSize / (float) mClockExpandedSize;
259
Jorim Jaggid7daab72014-05-06 22:22:20 +0200260 }
261
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200262 public void setActivityStarter(ActivityStarter activityStarter) {
263 mActivityStarter = activityStarter;
264 }
265
Jorim Jaggi853b0702014-07-05 04:31:14 +0200266 public void setBatteryController(BatteryController batteryController) {
267 mBatteryController = batteryController;
Jorim Jaggi06d551a2014-09-02 15:55:57 +0200268 ((BatteryMeterView) findViewById(R.id.battery)).setBatteryController(batteryController);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200269 }
270
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200271 public void setNextAlarmController(NextAlarmController nextAlarmController) {
272 mNextAlarmController = nextAlarmController;
273 }
274
Jorim Jaggid7daab72014-05-06 22:22:20 +0200275 public int getCollapsedHeight() {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200276 return mCollapsedHeight;
Jorim Jaggid7daab72014-05-06 22:22:20 +0200277 }
278
279 public int getExpandedHeight() {
280 return mExpandedHeight;
281 }
282
Jorim Jaggie65e3102014-07-01 22:00:50 +0200283 public void setListening(boolean listening) {
284 if (listening == mListening) {
285 return;
286 }
287 mListening = listening;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200288 updateListeners();
Jorim Jaggie65e3102014-07-01 22:00:50 +0200289 }
290
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200291 public void setExpanded(boolean expanded) {
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200292 boolean changed = expanded != mExpanded;
Jorim Jaggi9054d942014-05-09 22:47:28 +0200293 mExpanded = expanded;
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200294 if (changed) {
John Spurlock7e6809a2014-08-06 16:03:14 -0400295 updateEverything();
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200296 }
Jorim Jaggi9054d942014-05-09 22:47:28 +0200297 }
298
John Spurlock7e6809a2014-08-06 16:03:14 -0400299 public void updateEverything() {
300 updateHeights();
301 updateVisibilities();
302 updateSystemIconsLayoutParams();
303 updateClickTargets();
304 updateMultiUserSwitch();
John Spurlock7e6809a2014-08-06 16:03:14 -0400305 updateClockScale();
306 updateAvatarScale();
307 updateClockLp();
308 requestCaptureValues();
309 }
310
Jorim Jaggi9054d942014-05-09 22:47:28 +0200311 private void updateHeights() {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200312 int height = mExpanded ? mExpandedHeight : mCollapsedHeight;
Jorim Jaggi9054d942014-05-09 22:47:28 +0200313 ViewGroup.LayoutParams lp = getLayoutParams();
314 if (lp.height != height) {
315 lp.height = height;
Jorim Jaggid7daab72014-05-06 22:22:20 +0200316 setLayoutParams(lp);
Jorim Jaggi9054d942014-05-09 22:47:28 +0200317 }
Jorim Jaggie18c2cd2014-05-08 19:16:49 +0200318 }
319
Jorim Jaggi740beb52014-05-11 18:53:19 +0200320 private void updateVisibilities() {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200321 mDateCollapsed.setVisibility(mExpanded && mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
322 mDateExpanded.setVisibility(mExpanded && mAlarmShowing ? View.INVISIBLE : View.VISIBLE);
323 mAlarmStatus.setVisibility(mExpanded && mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
324 mSettingsButton.setVisibility(mExpanded ? View.VISIBLE : View.INVISIBLE);
Selim Cineke32010a2014-08-20 23:50:41 +0200325 mQsDetailHeader.setVisibility(mExpanded && mShowingDetail? View.VISIBLE : View.INVISIBLE);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200326 if (mSignalCluster != null) {
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200327 updateSignalClusterDetachment();
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200328 }
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200329 mEmergencyCallsOnly.setVisibility(mExpanded && mShowEmergencyCallsOnly ? VISIBLE : GONE);
330 mBatteryLevel.setVisibility(mExpanded ? View.VISIBLE : View.GONE);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200331 }
332
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200333 private void updateSignalClusterDetachment() {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200334 boolean detached = mExpanded;
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200335 if (detached != mSignalClusterDetached) {
336 if (detached) {
337 getOverlay().add(mSignalCluster);
338 } else {
Jorim Jaggi61d37f62014-07-30 17:26:55 +0200339 reattachSignalCluster();
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200340 }
341 }
342 mSignalClusterDetached = detached;
343 }
344
Jorim Jaggi61d37f62014-07-30 17:26:55 +0200345 private void reattachSignalCluster() {
346 getOverlay().remove(mSignalCluster);
347 mSystemIcons.addView(mSignalCluster, 1);
348 }
349
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200350 private void updateSystemIconsLayoutParams() {
Jorim Jaggi605f1902014-06-25 05:23:42 +0200351 RelativeLayout.LayoutParams lp = (LayoutParams) mSystemIconsSuperContainer.getLayoutParams();
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200352 int rule = mExpanded
Jorim Jaggi853b0702014-07-05 04:31:14 +0200353 ? mSettingsButton.getId()
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200354 : mMultiUserSwitch.getId();
355 if (rule != lp.getRules()[RelativeLayout.START_OF]) {
356 lp.addRule(RelativeLayout.START_OF, rule);
357 mSystemIconsSuperContainer.setLayoutParams(lp);
Adrian Roos59a61272014-06-06 19:07:24 +0200358 }
Jorim Jaggi740beb52014-05-11 18:53:19 +0200359 }
360
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200361 private void updateListeners() {
Jorim Jaggi853b0702014-07-05 04:31:14 +0200362 if (mListening) {
363 mBatteryController.addStateChangedCallback(this);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200364 mNextAlarmController.addStateChangedCallback(this);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200365 } else {
366 mBatteryController.removeStateChangedCallback(this);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200367 mNextAlarmController.removeStateChangedCallback(this);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200368 }
369 }
370
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200371 private void updateAvatarScale() {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200372 if (mExpanded) {
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200373 mMultiUserAvatar.setScaleX(1f);
374 mMultiUserAvatar.setScaleY(1f);
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200375 } else {
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200376 mMultiUserAvatar.setScaleX(mAvatarCollapsedScaleFactor);
377 mMultiUserAvatar.setScaleY(mAvatarCollapsedScaleFactor);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200378 }
379 }
380
381 private void updateClockScale() {
Jorim Jaggifc69f782014-08-14 16:55:35 +0200382 mTime.setTextSize(TypedValue.COMPLEX_UNIT_PX, mExpanded
383 ? mClockExpandedSize
384 : mClockCollapsedSize);
385 mTime.setScaleX(1f);
386 mTime.setScaleY(1f);
Jorim Jaggi329fa242014-07-11 21:42:00 +0200387 updateAmPmTranslation();
388 }
389
390 private void updateAmPmTranslation() {
391 boolean rtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
392 mAmPm.setTranslationX((rtl ? 1 : -1) * mTime.getWidth() * (1 - mTime.getScaleX()));
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200393 }
394
Jorim Jaggi853b0702014-07-05 04:31:14 +0200395 @Override
396 public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
Elliott Hughes88d25512014-10-03 12:06:17 -0700397 String percentage = NumberFormat.getPercentInstance().format((double) level / 100.0);
398 mBatteryLevel.setText(percentage);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200399 }
400
John Spurlock0ff62e02014-07-22 16:15:08 -0400401 @Override
402 public void onPowerSaveChanged() {
403 // could not care less
404 }
405
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200406 @Override
Jose Lima235510e2014-08-13 12:50:01 -0700407 public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) {
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200408 mNextAlarm = nextAlarm;
409 if (nextAlarm != null) {
410 mAlarmStatus.setText(KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm));
411 }
412 mAlarmShowing = nextAlarm != null;
Jorim Jaggi11c071a2014-08-14 19:17:11 +0200413 updateEverything();
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200414 requestCaptureValues();
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200415 }
416
Jorim Jaggi5d6957e2014-05-26 02:15:06 +0200417 private void updateClickTargets() {
Jorim Jaggi9d8ca0f2014-07-31 17:23:56 +0200418 mMultiUserSwitch.setClickable(mExpanded);
Selim Cineke32010a2014-08-20 23:50:41 +0200419 mMultiUserSwitch.setFocusable(mExpanded);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200420 mSystemIconsSuperContainer.setClickable(mExpanded);
Selim Cineke32010a2014-08-20 23:50:41 +0200421 mSystemIconsSuperContainer.setFocusable(mExpanded);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200422 mAlarmStatus.setClickable(mNextAlarm != null && mNextAlarm.getShowIntent() != null);
Jorim Jaggi5d6957e2014-05-26 02:15:06 +0200423 }
424
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200425 private void updateClockLp() {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200426 int marginBottom = mExpanded
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200427 ? mClockMarginBottomExpanded
428 : mClockMarginBottomCollapsed;
429 LayoutParams lp = (LayoutParams) mDateGroup.getLayoutParams();
430 if (marginBottom != lp.bottomMargin) {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200431 lp.bottomMargin = marginBottom;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200432 mDateGroup.setLayoutParams(lp);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200433 }
434 }
435
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200436 private void updateMultiUserSwitch() {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200437 int marginEnd;
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200438 int width;
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200439 if (mExpanded) {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200440 marginEnd = mMultiUserExpandedMargin;
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200441 width = mMultiUserSwitchWidthExpanded;
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200442 } else {
443 marginEnd = mMultiUserCollapsedMargin;
Jorim Jaggi87d84d42014-07-28 12:14:48 +0200444 width = mMultiUserSwitchWidthCollapsed;
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200445 }
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200446 MarginLayoutParams lp = (MarginLayoutParams) mMultiUserSwitch.getLayoutParams();
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200447 if (marginEnd != lp.getMarginEnd() || lp.width != width) {
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200448 lp.setMarginEnd(marginEnd);
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200449 lp.width = width;
Jorim Jaggi129e7ac2014-06-10 22:03:48 +0200450 mMultiUserSwitch.setLayoutParams(lp);
451 }
452 }
453
Jorim Jaggi54045422014-07-03 18:30:40 +0200454 public void setExpansion(float t) {
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200455 if (!mExpanded) {
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200456 t = 0f;
457 }
458 mCurrentT = t;
Jorim Jaggi54045422014-07-03 18:30:40 +0200459 float height = mCollapsedHeight + t * (mExpandedHeight - mCollapsedHeight);
Jorim Jaggid7daab72014-05-06 22:22:20 +0200460 if (height < mCollapsedHeight) {
461 height = mCollapsedHeight;
462 }
463 if (height > mExpandedHeight) {
464 height = mExpandedHeight;
465 }
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +0200466 setClipping(height);
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200467 updateLayoutValues(t);
468 }
469
470 private void updateLayoutValues(float t) {
471 if (mCaptureValues) {
472 return;
473 }
474 mCurrentValues.interpoloate(mCollapsedValues, mExpandedValues, t);
475 applyLayoutValues(mCurrentValues);
Jorim Jaggidb3e6ed2014-05-12 20:18:47 +0200476 }
477
478 private void setClipping(float height) {
479 mClipBounds.set(getPaddingLeft(), 0, getWidth() - getPaddingRight(), (int) height);
480 setClipBounds(mClipBounds);
Chris Craik7b7ca3c2014-07-11 13:32:19 -0700481 invalidateOutline();
Jorim Jaggid7daab72014-05-06 22:22:20 +0200482 }
483
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200484 public void setUserInfoController(UserInfoController userInfoController) {
Jorim Jaggi3f48f462014-07-08 16:53:29 +0200485 userInfoController.addListener(new UserInfoController.OnUserInfoChangedListener() {
486 @Override
487 public void onUserInfoChanged(String name, Drawable picture) {
488 mMultiUserAvatar.setImageDrawable(picture);
489 }
490 });
Jorim Jaggi3d878be2014-05-10 03:22:32 +0200491 }
492
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200493 @Override
494 public void onClick(View v) {
495 if (v == mSettingsButton) {
496 startSettingsActivity();
Jorim Jaggi853b0702014-07-05 04:31:14 +0200497 } else if (v == mSystemIconsSuperContainer) {
498 startBatteryActivity();
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200499 } else if (v == mAlarmStatus && mNextAlarm != null) {
500 PendingIntent showIntent = mNextAlarm.getShowIntent();
501 if (showIntent != null && showIntent.isActivity()) {
Jorim Jaggi85dc23c2014-09-08 14:42:29 +0200502 mActivityStarter.startActivity(showIntent.getIntent(), true /* dismissShade */);
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200503 }
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200504 }
505 }
506
507 private void startSettingsActivity() {
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200508 mActivityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS),
Jorim Jaggi85dc23c2014-09-08 14:42:29 +0200509 true /* dismissShade */);
Jorim Jaggi13c1b1f2014-05-11 21:55:00 +0200510 }
John Spurlockaf8d6c42014-05-07 17:49:08 -0400511
Jorim Jaggi853b0702014-07-05 04:31:14 +0200512 private void startBatteryActivity() {
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200513 mActivityStarter.startActivity(new Intent(Intent.ACTION_POWER_USAGE_SUMMARY),
Jorim Jaggi85dc23c2014-09-08 14:42:29 +0200514 true /* dismissShade */);
Jorim Jaggi853b0702014-07-05 04:31:14 +0200515 }
516
John Spurlockaf8d6c42014-05-07 17:49:08 -0400517 public void setQSPanel(QSPanel qsp) {
518 mQSPanel = qsp;
John Spurlock3e04cc82014-05-30 12:34:03 -0400519 if (mQSPanel != null) {
520 mQSPanel.setCallback(mQsPanelCallback);
521 }
Adrian Roos1ef80fe2014-07-14 22:53:54 +0200522 mMultiUserSwitch.setQsPanel(qsp);
John Spurlockaf8d6c42014-05-07 17:49:08 -0400523 }
John Spurlock3e04cc82014-05-30 12:34:03 -0400524
Selim Cinekc0ce82d2014-06-10 13:21:15 +0200525 @Override
526 public boolean shouldDelayChildPressedState() {
527 return true;
528 }
Selim Cinek45f904a2014-06-11 11:42:53 +0200529
Adrian Roos59a61272014-06-06 19:07:24 +0200530 public void setShowEmergencyCallsOnly(boolean show) {
Jorim Jaggi11c071a2014-08-14 19:17:11 +0200531 boolean changed = show != mShowEmergencyCallsOnly;
532 if (changed) {
533 mShowEmergencyCallsOnly = show;
534 if (mExpanded) {
535 updateEverything();
536 requestCaptureValues();
537 }
Adrian Roos59a61272014-06-06 19:07:24 +0200538 }
539 }
540
Jorim Jaggi266f6772014-07-10 19:13:17 +0200541 @Override
542 protected void dispatchSetPressed(boolean pressed) {
543 // We don't want that everything lights up when we click on the header, so block the request
544 // here.
545 }
546
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200547 private void captureLayoutValues(LayoutValues target) {
Jorim Jaggifc69f782014-08-14 16:55:35 +0200548 target.timeScale = mExpanded ? 1f : mClockCollapsedScaleFactor;
549 target.clockY = mClock.getBottom();
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200550 target.dateY = mDateGroup.getTop();
551 target.emergencyCallsOnlyAlpha = getAlphaForVisibility(mEmergencyCallsOnly);
552 target.alarmStatusAlpha = getAlphaForVisibility(mAlarmStatus);
553 target.dateCollapsedAlpha = getAlphaForVisibility(mDateCollapsed);
554 target.dateExpandedAlpha = getAlphaForVisibility(mDateExpanded);
555 target.avatarScale = mMultiUserAvatar.getScaleX();
556 target.avatarX = mMultiUserSwitch.getLeft() + mMultiUserAvatar.getLeft();
557 target.avatarY = mMultiUserSwitch.getTop() + mMultiUserAvatar.getTop();
Jorim Jaggia8c97b32014-08-25 16:03:22 +0200558 if (getLayoutDirection() == LAYOUT_DIRECTION_LTR) {
559 target.batteryX = mSystemIconsSuperContainer.getLeft()
560 + mSystemIconsContainer.getRight();
561 } else {
562 target.batteryX = mSystemIconsSuperContainer.getLeft()
563 + mSystemIconsContainer.getLeft();
564 }
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200565 target.batteryY = mSystemIconsSuperContainer.getTop() + mSystemIconsContainer.getTop();
566 target.batteryLevelAlpha = getAlphaForVisibility(mBatteryLevel);
567 target.settingsAlpha = getAlphaForVisibility(mSettingsButton);
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200568 target.settingsTranslation = mExpanded
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200569 ? 0
570 : mMultiUserSwitch.getLeft() - mSettingsButton.getLeft();
571 target.signalClusterAlpha = mSignalClusterDetached ? 0f : 1f;
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200572 target.settingsRotation = !mExpanded ? 90f : 0f;
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200573 }
John Spurlock07f6d3b2014-07-17 10:11:40 -0400574
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200575 private float getAlphaForVisibility(View v) {
576 return v == null || v.getVisibility() == View.VISIBLE ? 1f : 0f;
577 }
578
579 private void applyAlpha(View v, float alpha) {
Jorim Jaggi11c071a2014-08-14 19:17:11 +0200580 if (v == null || v.getVisibility() == View.GONE) {
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200581 return;
John Spurlock07f6d3b2014-07-17 10:11:40 -0400582 }
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200583 if (alpha == 0f) {
584 v.setVisibility(View.INVISIBLE);
585 } else {
586 v.setVisibility(View.VISIBLE);
587 v.setAlpha(alpha);
588 }
589 }
John Spurlock312b7922014-07-22 22:23:42 -0400590
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200591 private void applyLayoutValues(LayoutValues values) {
592 mTime.setScaleX(values.timeScale);
593 mTime.setScaleY(values.timeScale);
Jorim Jaggifc69f782014-08-14 16:55:35 +0200594 mClock.setY(values.clockY - mClock.getHeight());
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200595 mDateGroup.setY(values.dateY);
596 mAlarmStatus.setY(values.dateY - mAlarmStatus.getPaddingTop());
597 mMultiUserAvatar.setScaleX(values.avatarScale);
598 mMultiUserAvatar.setScaleY(values.avatarScale);
599 mMultiUserAvatar.setX(values.avatarX - mMultiUserSwitch.getLeft());
600 mMultiUserAvatar.setY(values.avatarY - mMultiUserSwitch.getTop());
Jorim Jaggia8c97b32014-08-25 16:03:22 +0200601 if (getLayoutDirection() == LAYOUT_DIRECTION_LTR) {
602 mSystemIconsSuperContainer.setX(values.batteryX - mSystemIconsContainer.getRight());
603 } else {
604 mSystemIconsSuperContainer.setX(values.batteryX - mSystemIconsContainer.getLeft());
605 }
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200606 mSystemIconsSuperContainer.setY(values.batteryY - mSystemIconsContainer.getTop());
Jorim Jaggi4538027d2014-07-30 15:43:13 +0200607 if (mSignalCluster != null && mExpanded) {
Jorim Jaggia8c97b32014-08-25 16:03:22 +0200608 if (getLayoutDirection() == LAYOUT_DIRECTION_LTR) {
609 mSignalCluster.setX(mSystemIconsSuperContainer.getX()
610 - mSignalCluster.getWidth());
611 } else {
612 mSignalCluster.setX(mSystemIconsSuperContainer.getX()
613 + mSystemIconsSuperContainer.getWidth());
614 }
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200615 mSignalCluster.setY(
616 mSystemIconsSuperContainer.getY() + mSystemIconsSuperContainer.getHeight()/2
617 - mSignalCluster.getHeight()/2);
618 } else if (mSignalCluster != null) {
619 mSignalCluster.setTranslationX(0f);
620 mSignalCluster.setTranslationY(0f);
621 }
622 mSettingsButton.setTranslationY(mSystemIconsSuperContainer.getTranslationY());
623 mSettingsButton.setTranslationX(values.settingsTranslation);
624 mSettingsButton.setRotation(values.settingsRotation);
625 applyAlpha(mEmergencyCallsOnly, values.emergencyCallsOnlyAlpha);
Selim Cinekba5b3a02014-09-23 15:34:53 +0200626 if (!mShowingDetail) {
627 // Otherwise it needs to stay invisible
628 applyAlpha(mAlarmStatus, values.alarmStatusAlpha);
629 }
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200630 applyAlpha(mDateCollapsed, values.dateCollapsedAlpha);
631 applyAlpha(mDateExpanded, values.dateExpandedAlpha);
632 applyAlpha(mBatteryLevel, values.batteryLevelAlpha);
633 applyAlpha(mSettingsButton, values.settingsAlpha);
634 applyAlpha(mSignalCluster, values.signalClusterAlpha);
Jorim Jaggifc69f782014-08-14 16:55:35 +0200635 if (!mExpanded) {
636 mTime.setScaleX(1f);
637 mTime.setScaleY(1f);
638 }
Jorim Jaggi90e0df22014-07-30 01:10:35 +0200639 updateAmPmTranslation();
640 }
641
642 /**
643 * Captures all layout values (position, visibility) for a certain state. This is used for
644 * animations.
645 */
646 private static final class LayoutValues {
647
648 float dateExpandedAlpha;
649 float dateCollapsedAlpha;
650 float emergencyCallsOnlyAlpha;
651 float alarmStatusAlpha;
652 float timeScale = 1f;
653 float clockY;
654 float dateY;
655 float avatarScale;
656 float avatarX;
657 float avatarY;
658 float batteryX;
659 float batteryY;
660 float batteryLevelAlpha;
661 float settingsAlpha;
662 float settingsTranslation;
663 float signalClusterAlpha;
664 float settingsRotation;
665
666 public void interpoloate(LayoutValues v1, LayoutValues v2, float t) {
667 timeScale = v1.timeScale * (1 - t) + v2.timeScale * t;
668 clockY = v1.clockY * (1 - t) + v2.clockY * t;
669 dateY = v1.dateY * (1 - t) + v2.dateY * t;
670 avatarScale = v1.avatarScale * (1 - t) + v2.avatarScale * t;
671 avatarX = v1.avatarX * (1 - t) + v2.avatarX * t;
672 avatarY = v1.avatarY * (1 - t) + v2.avatarY * t;
673 batteryX = v1.batteryX * (1 - t) + v2.batteryX * t;
674 batteryY = v1.batteryY * (1 - t) + v2.batteryY * t;
675 settingsTranslation = v1.settingsTranslation * (1 - t) + v2.settingsTranslation * t;
676
677 float t1 = Math.max(0, t - 0.5f) * 2;
678 settingsRotation = v1.settingsRotation * (1 - t1) + v2.settingsRotation * t1;
679 emergencyCallsOnlyAlpha =
680 v1.emergencyCallsOnlyAlpha * (1 - t1) + v2.emergencyCallsOnlyAlpha * t1;
681
682 float t2 = Math.min(1, 2 * t);
683 signalClusterAlpha = v1.signalClusterAlpha * (1 - t2) + v2.signalClusterAlpha * t2;
684
685 float t3 = Math.max(0, t - 0.7f) / 0.3f;
686 batteryLevelAlpha = v1.batteryLevelAlpha * (1 - t3) + v2.batteryLevelAlpha * t3;
687 settingsAlpha = v1.settingsAlpha * (1 - t3) + v2.settingsAlpha * t3;
688 dateExpandedAlpha = v1.dateExpandedAlpha * (1 - t3) + v2.dateExpandedAlpha * t3;
689 dateCollapsedAlpha = v1.dateCollapsedAlpha * (1 - t3) + v2.dateCollapsedAlpha * t3;
690 alarmStatusAlpha = v1.alarmStatusAlpha * (1 - t3) + v2.alarmStatusAlpha * t3;
John Spurlock312b7922014-07-22 22:23:42 -0400691 }
692 }
John Spurlock07f6d3b2014-07-17 10:11:40 -0400693
John Spurlock7f8f22a2014-07-02 18:54:17 -0400694 private final QSPanel.Callback mQsPanelCallback = new QSPanel.Callback() {
John Spurlock465cefa2014-08-16 10:39:33 -0400695 private boolean mScanState;
696
John Spurlock7f8f22a2014-07-02 18:54:17 -0400697 @Override
698 public void onToggleStateChanged(final boolean state) {
699 post(new Runnable() {
700 @Override
701 public void run() {
702 handleToggleStateChanged(state);
703 }
704 });
705 }
706
707 @Override
708 public void onShowingDetail(final QSTile.DetailAdapter detail) {
709 post(new Runnable() {
710 @Override
711 public void run() {
712 handleShowingDetail(detail);
713 }
714 });
715 }
716
John Spurlock486b78e2014-07-07 08:37:56 -0400717 @Override
718 public void onScanStateChanged(final boolean state) {
719 post(new Runnable() {
720 @Override
721 public void run() {
722 handleScanStateChanged(state);
723 }
724 });
725 }
726
John Spurlock7f8f22a2014-07-02 18:54:17 -0400727 private void handleToggleStateChanged(boolean state) {
John Spurlock486b78e2014-07-07 08:37:56 -0400728 mQsDetailHeaderSwitch.setChecked(state);
729 }
730
731 private void handleScanStateChanged(boolean state) {
John Spurlock465cefa2014-08-16 10:39:33 -0400732 if (mScanState == state) return;
733 mScanState = state;
734 final Animatable anim = (Animatable) mQsDetailHeaderProgress.getDrawable();
735 if (state) {
736 mQsDetailHeaderProgress.animate().alpha(1f);
737 anim.start();
738 } else {
739 mQsDetailHeaderProgress.animate().alpha(0f);
740 anim.stop();
741 }
John Spurlock7f8f22a2014-07-02 18:54:17 -0400742 }
743
744 private void handleShowingDetail(final QSTile.DetailAdapter detail) {
745 final boolean showingDetail = detail != null;
Jorim Jaggic7dea6e2014-07-26 14:36:57 +0200746 transition(mClock, !showingDetail);
747 transition(mDateGroup, !showingDetail);
Jorim Jaggie17c4b42014-08-26 17:27:31 +0200748 if (mAlarmShowing) {
749 transition(mAlarmStatus, !showingDetail);
750 }
John Spurlock7f8f22a2014-07-02 18:54:17 -0400751 transition(mQsDetailHeader, showingDetail);
Selim Cineke32010a2014-08-20 23:50:41 +0200752 mShowingDetail = showingDetail;
John Spurlock7f8f22a2014-07-02 18:54:17 -0400753 if (showingDetail) {
Jason Monk6783bef2014-09-22 13:50:05 -0400754 mQsDetailHeaderTitle.setText(detail.getTitle());
John Spurlock7f8f22a2014-07-02 18:54:17 -0400755 final Boolean toggleState = detail.getToggleState();
756 if (toggleState == null) {
John Spurlock486b78e2014-07-07 08:37:56 -0400757 mQsDetailHeaderSwitch.setVisibility(INVISIBLE);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400758 mQsDetailHeader.setClickable(false);
759 } else {
John Spurlock486b78e2014-07-07 08:37:56 -0400760 mQsDetailHeaderSwitch.setVisibility(VISIBLE);
761 mQsDetailHeaderSwitch.setChecked(toggleState);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400762 mQsDetailHeader.setClickable(true);
763 mQsDetailHeader.setOnClickListener(new OnClickListener() {
764 @Override
765 public void onClick(View v) {
John Spurlocka7cf5592014-07-15 10:55:08 -0400766 detail.setToggleState(!mQsDetailHeaderSwitch.isChecked());
John Spurlock7f8f22a2014-07-02 18:54:17 -0400767 }
768 });
769 }
770 } else {
771 mQsDetailHeader.setClickable(false);
772 }
773 }
774
775 private void transition(final View v, final boolean in) {
776 if (in) {
777 v.bringToFront();
Selim Cineke32010a2014-08-20 23:50:41 +0200778 v.setVisibility(VISIBLE);
John Spurlock7f8f22a2014-07-02 18:54:17 -0400779 }
Selim Cineke32010a2014-08-20 23:50:41 +0200780 v.animate()
781 .alpha(in ? 1 : 0)
782 .withLayer()
783 .withEndAction(new Runnable() {
784 @Override
785 public void run() {
786 if (!in) {
787 v.setVisibility(INVISIBLE);
788 }
789 }
790 })
791 .start();
John Spurlock7f8f22a2014-07-02 18:54:17 -0400792 }
793 };
Jorim Jaggid7daab72014-05-06 22:22:20 +0200794}